我有一个基于以下模型的嵌套表单 - 课程有很多问题,每个问题有很多答案,答案属于用户。
我正在开发一个嵌套表单,以便新用户可以查看问题并发布答案。如果用户过去输入了答案,我希望这些答案出现;否则显示空白字段。我也不希望用户看到其他人的答案。
所以,我无法弄清楚如何只显示当前登录用户的答案。我创建了一个named_scope,但它不起作用(请参阅我的编辑操作)。现在,在编辑时,我会在每个问题下面看到所有用户的答案。 为了构建视图,我遵循了Railscast 196中的嵌套表单示例。
感谢您的帮助。 这是显示我的模型和课程控制器的代码。
class Lesson < ActiveRecord::Base
has_many :questions, :dependent => :destroy
accepts_nested_attributes_for :questions, :allow_destroy => true,
:reject_if => proc { |a| a['data'].blank? }
end
class Question < ActiveRecord::Base
belongs_to :lesson
has_many :answers
accepts_nested_attributes_for :answers,
:reject_if => lambda { |a| a['data'].blank? }, :allow_destroy => true
end
class Answer < ActiveRecord::Base
belongs_to :question
belongs_to :user
named_scope :by_user,
lambda {|user| {:conditions => ["user_id = ?", user]}}
end
class User < ActiveRecord::Base
has_many :answers
accepts_nested_attributes_for :answers,
:reject_if => lambda { |a| a['name'].blank? }, :allow_destroy => true
end
LESSONS Controller:
def edit
@lesson = Lesson.find(params[:id])
if current_user_admin == 99 # show blank question field if admin user
@questions = @lesson.questions.build(:user_id => current_user)
end
@lesson.questions.each do |question|
# if there are no answers for this user
if question.answers.by_user(current_user.id).size != 1
# if the current user is not admin
if current_user_admin != 99
question.answers.by_user(current_user.id).build(:user => current_user)
end
end
end
end
答案 0 :(得分:0)
这个命名范围看起来应该对我有用。您确定数据库中的答案记录是否已正确设置user_id
?
我认为你在reject_if
lambda中得到的哈希值的键是字符串而不是符号,所以你的嵌套模型字段可能会被静默拒绝。
答案 1 :(得分:0)
Iv发现控制器中的代码存在问题。你正在每个块中构建一个回答对象,它会遍历答案,只有当答案为nil时才会发生,这种情况永远不会发生。
我认为你在控制器中尝试做的事情是:
def edit
@lesson = Lesson.find(params[:id])
@lesson.questions.each do |question|
if question.answers.by_user(current_user.id).empty?
question.answers.build(:user => current_user)
end
end
end