Rails 3 undefined方法`model_name'用于Array:Class

时间:2011-05-06 17:08:22

标签: ruby-on-rails ruby-on-rails-3

answers_controller:

@questions = Question.order("qtype, position")
@ans = Answer.where(user_id = current_user.id)
@answers = @questions.map { |q| [q, @ans.find_by_question_id(q.id)] }

视图:

<%= form_for @answers, :remote => true do |form| %>

错误是因为@answers被映射了吗?任何帮助表示赞赏。

更新:

答案模型:

belongs_to :user
belongs_to :question

用户模型:

has_many :answers

问题模型:

has_many :answers

更新2: 我将以下内容复制并粘贴到控制器中。

@answers = current_user.answers.questions

我得到了以下内容:

undefined method `questions' for #<Class:0x1032d6d98>

我尝试采用第二种方法 - 用户模型:

has_many :answers, :through => :answers

控制器:

@questions = current_user.questions

得到了:

undefined method `questions' for #<User:0x103569ec0>
app/controllers/answers_controller.rb:18:in `index'

3 个答案:

答案 0 :(得分:2)

是的,这就是原因。你可能想做:     current_user.answers.questions

如果您根据需要设置了关联,那么将完全返回您想要的内容(通过在幕后使用连接)

更新

现在,通过查看你的联想,我不确定,你想要完成什么。 @answers = current_user.answers不会返回所有答案,然后在视图中您可以使用答案和相应的问题(并仍然使用form_for @answers)。 但是,如果你想要@questions,你可以这样做:

首先,将用户与问题相关联


class User
  has_many :questions, :through => :answers
end

你的控制器:


@questions = current_user.questions

希望它有所帮助。

答案 1 :(得分:1)

@answers = @questions.map { |q| [q, @ans.find_by_question_id(q.id)] }

这将为您提供一个数组数组,这些数组又包含问题和所有问题答案的另一个数组。像这样:

[[q1, [q1_answer1, q1_answer2]], [q2, [q2_answer1, q2_answer2,...]], ...]

因此,每个答案都在一个数组中,该数组本身在@answers内部为2级。

至于你引用current_user.answers时的问题,你会得到一系列答案。

关联是针对类的实例,而不是它们的集合。也就是说,您可以调用answer.question来获取与给定答案相关的问题。但是,您不能像上面那样只调用answers.questions,因为a)答案是数组,而不是答案实例,b)关联是'问题',而不是'问题'

如果您尝试获取所有答案的所有问题,则需要对每个答案进行某种操作,例如:

questions = current_user.answers.map{|answer| answer.question}

将每个答案的每个问题映射到一个数组中。请注意,如果用户对问题有多个答案,则该问题将多次出现在数组中。它可以用'uniq'方法重复删除。

答案 2 :(得分:1)

如果我理解正确,您希望列出所有答案,但顺序与您的问题相同。

我假设您的模型看起来像

class User
  has_many :questions, :through => :answers
  has_many :answers
end

class Question
  has_many :answers
  has_many :users, :through => :answers
end

class Answer
  belongs_to :user
  belongs_to :question 
end

获取current_user的问题应该成为:

@questions = current_user.questions.order("qtype, position")

获得相应的答案然后变为

@answers = @questions.map{|q| q.answer}

希望这有帮助。