Rails cache curly braces block syntax error - ruby-on-rails

Anyone know why I get a syntax error when I try to use curly braces block syntax for Rails.cache.fetch
This errors out with error (syntax error, unexpected '{', expecting keyword_end (SyntaxError) )
Rails.cache.fetch "person/#{id}" { find(id) }
The following works:
Rails.cache.fetch "person/#{id}" do
find(id)
end

This is because {} has different precedence than do end. In the first expression they are tied to the "person/#{id}" part of the expression.
So your first example is similar to:
Rails.cache.fetch("person/#{id}" { find(id) })
while the second is:
Rails.cache.fetch("person/#{id}") { find(id) }

the short block needs () before to recognise the syntax it should look something like
Rails.cache.fetch("person/#{id}") { find(id) }

Related

setting conditional attributes for API connection

A method needs to instantiate a session with various attributes, some of which are optional
session = Checkout::Session.create({
locale: I18n.locale,
reference_id: id,
customer_email: #user_mail,
[...]
})
The last shown attribute, customer_email, is optional but it should not be generated if the value does not exist.
customer_email: #user_mail unless !#user_email,
logically hits a syntax error because an additional param (the comma) is being produced
syntax error, unexpected ',', expecting end
and thus the API expects another attribute.
(customer_email: #user_mail, unless !#user_email)
also fails as there is confusion over the parenthesis
syntax error, unexpected ')', expecting then or ';' or '\n'
How should this syntax be cast?
You need to extract the options hash into a variable and manipulate it before sending it to the Checkout::Session.create.
Something like this:
options = {
locale: I18n.locale,
reference_id: id
}
options[:customer_email] = #user_mail if #user_email
session = Checkout::Session.create(options)

improper jbuilder syntax for output during API error handling

The following is a json.jbuildermethod intended to respond to an API call.
if #error_code_98?
json.set! :chain_category do
json.set! :error, #error_98_messages
end
end
#error_code_99 = true when said errors arise.
error_98_messages is a concatenation of string that provide an indentifier with the nature of the error. They are accumulated as an array of items are handled by the API action.
When the error hits, the instance variable gets populated, but at the end of the action the return message this the following error
syntax error, unexpected tSYMBEG, expecting ':'
json.set! :chain_category do
I thought this was respecting the syntax for dynamic attribution, but that is mistaken. Where is the syntax off?

Rails Syntax error in if Statement

Hello i think i'm blind and i don't find the bug in the syntax
def update
#list = List.find_by(key: params[:id])
if (check_email_link(params[:expdate] && #list.update(wishlist_params))
flash[:notice] = t("update")
redirect_to (admin_list_url)
else
flash[:error] = t("not_active")
render 'edit'
end
end
The expdate contains a datetimestamp and the check_email_link is a method that checks the date and time of a link in the mail
There are three syntax errors
app/controllers/admin/lists_controller.rb:32: syntax error, unexpected keyword_else, expecting ')'
app/controllers/admin/lists_controller.rb:35: syntax error, unexpected keyword_end, expecting ')'
app/controllers/admin/lists_controller.rb:86: syntax error, unexpected keyword_end, expecting ')'
I'm an idiot or i'm blind. Can someone help an explain me the error? Thanks
(check_email_link(params[:expdate] && #list.update(wishlist_params)) has three (s and two )s. You need either another ) or one less (. I can't be sure where, as I don't know your code.
While we're on it, the if line shouldn't be indented the extra level, as it kinda makes it look like the line above starts a block.

writing a rspec test for checking a function that returns a hash table

Trying to write an RSpec test that checks a function location_counts(piece) that returns a hash table with some keys and values assigned.
describe "location_counts(piece)" do
it "should return a hash table with a key of locations and value of times visited" do
game = FactoryGirl.create(:game)
black_queen = FactoryGirl.create(:queen, game_id: game.id, row: 8, column: 4, is_black: true)
black_queen.move_to(4,4)
black_queen.move_to(1,1)
black_queen.move_to(4,4)
expect(game.location_counts(black_queen)).to be {"4, 4"=>2, "1, 1"=>1}
end
end
With this test, I'm getting a syntax error.
That looks like:
/usr/local/rvm/gems/ruby-2.3.0/gems/rspec-core-3.5.4/lib/rspec/core/configuration.rb:1435:in `load': /home/ubuntu/workspace/chess-app/spec/models/game_spec.rb:101: syntax error, unexpected =>, expecting '}' (SyntaxError)
...s(black_queen)).to be {"4, 4"=>2, "1, 1"=>1}
... ^
/home/ubuntu/workspace/chess-app/spec/models/game_spec.rb:101: syntax error, unexpected =>, expecting '}'
...en)).to be {"4, 4"=>2, "1, 1"=>1}
... ^
The problem seems to be that ruby is interpreting your expected hash:
expect(game.location_counts(black_queen)).to be {"4, 4"=>2, "1, 1"=>1}
as a block passed to the be method, instead of as a parameter. Try the following:
expect(game.location_counts(black_queen)).to eq({"4, 4"=>2, "1, 1"=>1})
or even removing the curly braces, as the hash is the last parameter passed to the be method:
expect(game.location_counts(black_queen)).to eq("4, 4"=>2, "1, 1"=>1)
EDIT: Regard the usage of eq instead of be.

Having trouble using where.not in rails

I am trying to use where.not to replace the following:
if #friend_matches.count > 0
#court_matches = Match.available_on_courts.where('matches.id NOT IN (?)', #friend_matches.pluck(:id)).to_a
else
#court_matches = Match.available_on_courts
end
With
#court_matches = Match.available_on_courts.where.not(matches.id: #friend_matches.pluck(:id)).to_a
However I am getting the following errors.
SyntaxError: /Users/sripaladugu/Coding/matchpoint_rails/app/mailers/match_mailer.rb:8: syntax error, unexpected ':'
...on_courts.where.not(matches.id: #friend_matches.pluck(:id))....
... ^
/Users/sripaladugu/Coding/matchpoint_rails/app/mailers/match_mailer.rb:8: syntax error, unexpected ')', expecting keyword_end
...id: #friend_matches.pluck(:id)).to_a
You can provide a hash within where to specify table names as keys and column names within the second level:
#court_matches = Match.available_on_courts
.where.not(matches: { id: #friend_matches.pluck(:id) })
.to_a

Resources