Rails Nested Form - Фильтр по текущему пользователю, урок-вопросы-ответы-пользователи - PullRequest
1 голос
/ 21 октября 2010

У меня есть вложенная форма, основанная на следующей модели: урок состоит из множества вопросов, каждый вопрос имеет много ответов, и ответы принадлежат пользователям.

Я разрабатываю вложенную форму, чтобы новый пользователь мог просматривать вопросы и публиковать ответы.Если пользователь вводил ответы в прошлом, я хочу, чтобы они отображались;в противном случае показывать пустые поля.Я также не хочу, чтобы пользователь видел ответы других пользователей.

Итак, я не могу понять, как показать только ответы для текущего пользователя, вошедшего в систему.Я создал 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 голосов
/ 22 октября 2010

Iv обнаружил проблему с кодом в вашем контроллере.Вы создаете объект ответа внутри каждого блока, который повторяет ответы, только если этот ответ равен нулю, что никогда не произойдет.

Я думаю, что то, что вы пытаетесь сделать в контроллере, выглядит примерно так:

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
0 голосов
/ 21 октября 2010

Эта именованная область видимости должна работать для меня.Вы уверены, что записи ответов в вашей базе данных имеют user_id, установленный правильно?

Я думаю, что хэш, который вы получаете в reject_if лямбда-выражении, содержит ключи, которые строки , асимволы, поэтому поля вложенных моделей могут быть незаметно отклонены.

...