Hi friends , I am modifying virtualX open source application. I wanted
to
introduce new functionality that is uploading questions from .csv file
and
storing those questions to the database. I am very new to ruby this task
becomes very tough for me . So i referred so many websites and blogs and
i
ready some code for this feature . but this is code is not working . I
am
getting HTTP 500 error . As i checked code in Aptanan Studio , it is
showing some errors. I am posting my code over here . Please help me
friends . I am really not getting what is happening .
if @question.count == 1 @question.first.update_attributes(question_hash)
else
Question.save!(question_hash)
end # end if !@question.nil?
end # end CSV.foreach
end # end self.import(file)
Hi friends , I am modifying virtualX open source application. I wanted to
introduce new functionality that is uploading questions from .csv file and
storing those questions to the database. I am very new to ruby this task
becomes very tough for me . So i referred so many websites and blogs and i
ready some code for this feature . but this is code is not working . I am
getting HTTP 500 error . As i checked code in Aptanan Studio , it is
showing some errors.
In future, please also post the errors; since this isn’t all the code in
your application we can’t run it to see what happens, and are relying on
you to tell us.
You’ve defined the import method below as a class method (def self.import) but are attempting to call an instance method here on @question.
The two lines above should likely be:
Question.import(params[:file])
Double-check your source file: the line you’ve pasted here has
slant-quotes
(“ and ”) which are not the same thing to Ruby as a straight
double-quote
("). It’s also possible that these were adding while composing the
email.
if @question.count == 1 @question.first.update_attributes(question_hash)
else
Question.save!(question_hash)
What is the intent of this line? Are there situations where you can have
multiple Question records with the same ID? There is not a class
method
called save! built into ActiveRecord.
def import @question = Question.new ## You have just created a new instance
of
model class Question @question.import(params[:file])
redirect_to root_url, notice: “Questions imported succefully.”
end
class Question
validates :id, uniqueness: true ## see below
def self.import(file)
CSV.foreach(file.path, headers: true) do |row| ## okay so you will
iterate by row
question_hash = row.to_hash
## This is okay, but you should put a watch on
row,
and understand its structure. In doing so, you may not need to convert
row
to row.to_hash. Otherwise, you should put a watch on row.to_hash to
verify
that the
## structure of the ‘row’ is consistent with
your
database structure and other matters that may be in your Question model
##@question = Question.where(id:
question_hash[“id”])
## okay this seems reasonable but at the model
level rather than creating a new Question object, you should rather be
doing validation on id, see above.
## If I were you I would do validation on the
record, not just the id
## if @question.count == 1
##@question.first.update_attributes(question_hash) ## self not new
instance of Question @return_value_on_update_attributes =
self.update_attributes(question_hash) ## Read: http://apidock.com/rails/ActiveRecord/Base/update_attributes
unless @return_value_on_update_attributes ## unless @return_value_on_update_attributes is false, eg, if not true
puts "There was an error in record " + question_hash[“id”]
puts self.errors.to_yaml ## This way you can continue, and then
later you need to check for errors. Of course there are other ways to
manage and learn errors. But for now…
end # end unless
end # end foreach