Rails CSV import not functioning properly - ruby-on-rails

Basically, CSV import doesn't work.
Model Code:
def self.import(file,admin_id)
spreadsheet = open_spreadsheet(file)
header = spreadsheet.row(1)
(2..spreadsheet.last_row).each do |i|
row = Hash[[header, spreadsheet.row(i)].transpose]
new_row = row.to_hash.merge(:merchant_id => admin_id)
Inventory.create! new_row
end
end
def self.open_spreadsheet(file)
require 'iconv'
case File.extname(file.original_filename)
when ".csv" then Roo::Csv.new(file.path, nil, :ignore)
when ".xls" then Roo::Excel.new(file.path, nil, :ignore)
when ".xlsx" then Roo::Excelx.new(file.path, nil, :ignore)
else raise "Unknown file type: #{file.original_filename}"
end
end
Controller action:
def import
Inventory.import(params[:file],params[:admin_id])
redirect_to :inventories, :notice => "Imported Successfully."
end
Import button, select file, all that working fine. On submit:
SyntaxError in InventoriesController#import
(eval):2: syntax error, unexpected tIDENTIFIER, expecting ')'
read_key(:Parts name)
^
(eval):6: syntax error, unexpected tIDENTIFIER, expecting ')'
read_key_before_type_cast(:Parts name)
^
(eval):10: syntax error, unexpected tIDENTIFIER, expecting ')'
write_key(:Parts name, value)
^
(eval):10: syntax error, unexpected ')', expecting '='
(eval):14: syntax error, unexpected tIDENTIFIER, expecting ')'
read_key(:Parts name).present?
^
(eval):15: syntax error, unexpected $end, expecting keyword_end
Can someone please shed some light on this? I can't even find a good way to debug the actual method to see exactly what it tries to do and how it fails on.
There is a template CSV file that looks like this across the header row:
Parts name Parts
number Quantity Cost Price Tax Location Description Is editable

Per my comment, the syntax errors arise from trying to turn the column names into symbols, which doesn't work if the column names contain spaces. The offending code appears to be in https://github.com/jnunemaker/mongomapper/blob/f5f695215effea909df65304898f4512600baa08/lib/mongo_mapper/plugins/keys.rb, but I didn't check to see if there is documentation or an issue relating to this.

The answer turned out to be the spaces in the header names. I wish Peter would submit the answer so I can click it

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)

unexpected tLabel ')' '=' and else

I'm getting this syntax error and I don't know what I'm supposed to do and I'm new to Ruby. In the future could someone tell me how I can resolve syntax errors
SyntaxError (/Users/admin/Moralyzer/app/controllers/petition_posts_controller.rb:23: syntax error, unexpected tLABEL, expecting ')'
url: item['url'],
^~~~
/Users/admin/Moralyzer/app/controllers/petition_posts_controller.rb:24: syntax error, unexpected tLABEL, expecting '='
media_type: item['type']
^~~~~~~~~~~
/Users/admin/Moralyzer/app/controllers/petition_posts_controller.rb:25: syntax error, unexpected ')', expecting end
)
^
/Users/admin/Moralyzer/app/controllers/petition_posts_controller.rb:28: syntax error, unexpected else, expecting end
else
^~~~
/Users/admin/Moralyzer/app/controllers/petition_posts_controller.rb:58: syntax error, unexpected end-of-input, expecting end):
app/controllers/petition_posts_controller.rb:23: syntax error, unexpected tLABEL, expecting ')'
app/controllers/petition_posts_controller.rb:24: syntax error, unexpected tLABEL, expecting '='
app/controllers/petition_posts_controller.rb:25: syntax error, unexpected ')', expecting end
app/controllers/petition_posts_controller.rb:28: syntax error, unexpected else, expecting end
app/controllers/petition_posts_controller.rb:58: syntax error, unexpected end-of-input, expecting end
The code
# POST /petition_posts
def create
#petition_posts = PetitionPost.new(petition_posts_params)
if #petition_posts.save
for item in media
#petition_posts.media.create (
url: item['url'],
media_type: item['type']
)
end
render json: #petition_posts, status: :created, location: #petition_posts
else
render json: #petition_posts.errors, status: :unprocessable_entity
end
end
Ruby doesn't want white-space between method name and the opening parentheses
#petition_posts.media.create (
should be
#petition_posts.media.create(
As a bonus point for loops are not the Ruby way, use each instead
media.each do |item|
#petition_posts.media.create(url: item['url'], media_type: item['type'])
end
Try changing this:
#petition_posts.media.create (
url: item['url'],
media_type: item['type']
)
To this:
#petition_posts.media.create(url:item['url'], media_type:item['type'])
All in one line.
Edit: I don't mean to edit so much in one minute (I'm kind of new to stackoverflow) but I figured out the issue. It isn't whitespace but where you put the terminating ')' for that function.
So the following are all valid:
#petition_posts.media.create(url:item['url'],
media_type:item['type'])
#petition_posts.media.create(
url:item['url'],
media_type:item['type'])
#petition_posts.media.create(
url:item['url'], media_type:item['type'])
As long as the ')' is attached to the end of your arguments list, you should be good.

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