我有一项调查,我希望每当用户第一次回答问题时,都会将参与者添加到Participant
模型中。该调查有点特殊,因为它有许多功能可以回答标记词,多项选择和开放式问题等问题,每个函数实际上都是一个有自己记录的模型。此外,我只想让参与者保存一次。
参与者模型非常简单:
class Participant < ActiveRecord::Base
belongs_to :survey
attr_accessible :survey_id, :user_id
end
调查模型也很简单:
class Survey < ActiveRecord::Base
...
has_many :participants, :through => :users
has_many :rating_questions, :dependent => :destroy
has_many :open_questions, :dependent => :destroy
has_many :tag_questions, :dependent => :destroy
belongs_to :account
belongs_to :user
accepts_nested_attributes_for :open_questions
accepts_nested_attributes_for :rating_questions
accepts_nested_attributes_for :tag_questions
...
end
然后,您拥有rating_answers
等属于rating_question
,open_answers
属于open_questions
的模型,依此类推。
所以最初我想在我的模型中rating_answers
我可以将after_create
回调添加到add_participant
class RatingAnswer < ActiveRecord::Base
belongs_to :rating_question
after_create :add_participant
...
protected
def add_participant
@participant = Participant.where(:user_id => current_user.id, :survey_id => Survey.find(params[:survey_id]))
if @participant.nil?
Participant.create!(:user_id => current_user.id, :survey_id => Survey.find(params[:survey_id]))
end
end
end
在这种情况下,我不知道如何找到survey_id,所以我尝试使用params,但我不认为这是正确的方法。它返回了这个错误
NameError (undefined local variable or method `current_user' for #<RatingAnswer:0x0000010325ef00>):
app/models/rating_answer.rb:25:in `add_participant'
app/controllers/rating_answers_controller.rb:12:in `create'
我的另一个想法是创建一个我可以在每个控制器中使用的模块Participants.rb
module Participants
def add_participant
@participant = Participant.where(:user_id => current_user.id, :survey_id => Survey.find(params[:survey_id]))
if @participant.nil?
Participant.create!(:user_id => current_user.id, :survey_id => Survey.find(params[:survey_id]))
end
end
end
并在控制器中
class RatingAnswersController < ApplicationController
include Participants
def create
@rating_question = RatingQuestion.find_by_id(params[:rating_question_id])
@rating_answer = RatingAnswer.new(params[:rating_answer])
@survey = Survey.find(params[:survey_id])
if @rating_answer.save
add_participant
respond_to do |format|
format.js
end
end
end
end
我收到了路由错误
ActionController::RoutingError (uninitialized constant RatingAnswersController::Participants):
我可以理解这个错误,因为我没有带有create方法及其路由资源的参与者的控制器
我不确定从嵌套模型向模型添加记录的正确方法是什么,以及什么是更清洁的方法。
非常欢迎您的想法!
答案 0 :(得分:1)
current_user是一个只能在视图/控制器中访问的帮助程序。您需要将其作为参数传递到模型中。否则,模型中无法访问它。可能是,这应该有所帮助。
答案 1 :(得分:0)
最后我最终使用了after_create
回调,但是我没有从参数中获取数据,而是使用了关联。 if @participant.nil?
也因某种原因无效。
class RatingAnswer < ActiveRecord::Base
belongs_to :rating_question
after_create :add_participant
...
protected
def add_participant
@participant = Participant.where(:user_id => self.user.id, :survey_id => self.rating_question.survey.id)
unless @participant.any?
@new_participant = Participant.create(:user_id => self.user.id, :survey_id => self.survey.rating_question.id)
end
end
end
关联的很酷的事情是,如果你有深层嵌套的关联,而不是
Survey has_many questions
Question has_many answers
Answer has_many responses
为了从响应模型中获取调查ID,您可以
self.answer.question.survey.id
非常漂亮!