Rails嵌套表单 - 按当前用户筛选,课程 - 问题 - 答案 - 用户

时间:2010-10-21 17:50:45

标签: ruby-on-rails nested-forms named-scope

我有一个基于以下模型的嵌套表单 - 课程有很多问题,每个问题有很多答案,答案属于用户。

我正在开发一个嵌套表单,以便新用户可以查看问题并发布答案。如果用户过去输入了答案,我希望这些答案出现;否则显示空白字段。我也不希望用户看到其他人的答案。

所以,我无法弄清楚如何只显示当前登录用户的答案。我创建了一个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

2 个答案:

答案 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