1

(注意:这里的源代码https://github.com/cthielen/dss-evote

我有一个简单的投票应用程序。调查是要投票的一组问题,选票是每个用户的偏好实例,而选票 has_many 偏好对于每个用户都是唯一的。这是建模:

class Ballot < ActiveRecord::Base
  belongs_to :survey
  has_many :preferences
end

class Survey < ActiveRecord::Base
  has_many :questions
  has_many :eligibilities
  has_many :ballots

  accepts_nested_attributes_for :questions, :allow_destroy => true

  attr_accessible :title, :description, :status, :deadline, :questions_attributes

  def owner
    Person.find(owner_id)
  end
end

class Question < ActiveRecord::Base
  belongs_to :survey
  has_many :preferences
end

class Preference < ActiveRecord::Base
  belongs_to :ballot
  belongs_to :question
end

routes.rb 只有这个:resources :surveys do resources :ballots end

/surveys/1 似乎有效,甚至 /surveys/1/ballots。/surveys/1/ballots/new 是我遇到问题的地方:

在 ballots_controller.rb 中:

def new
  @survey = Survey.find(params[:survey_id])

  @ballot = @survey.ballots.build

  @survey.questions.count.times { @ballot.preferences.build }

  respond_to do |format|
    format.html # new.html.erb
  end
end

(对应视图)

<%= form_for [@survey, @ballot] do |f| %>
  <%= f.fields_for @ballot.preferences do |preferences_fields| %>
    <% for question in @preferences_fields %>
      <p>
    <%= f.label question.question %>
    <%= radio_button(question.id, "preference", "Yes") %> Yes
    <%= radio_button(question.id, "preference", "No") %> No
    <%= radio_button(question.id, "preference", "Decline") %> Decline
  </p>
    <% end %>
  <% end %>

  <div class="actions">
    <%= f.submit "Vote" %>
  </div>
<% end %>

导致错误:

NoMethodError in Ballots#new

Showing /Users/cthielen/Projects/Work/dss-evote/app/views/ballots/_form.html.erb where line #2 raised:

undefined method `model_name' for Array:Class
Extracted source (around line #2):

1: <%= form_for [@survey, @ballot] do |f| %>
2:   <% f.fields_for @ballot.preferences do |preferences_fields| %>
3:     <% for question in @preferences_fields %>
4:       <p>
5:      <%= f.label question.question %>

现在,似乎正在形成一个数组而不是类的正确实例,但我不知道如何正确解决这个问题。

编辑:我应该提到我试图建立@ballot.preferences 的原因是偏好代表一个人的答案,并且偏好的长度可能会因调查而异。因此,如果调查有六个问题,@ballot.survey.questions.length 将为 6,我需要创建 6 个空白的@ballot.preferences,然后将由 form_for 表示,并希望使用 RESTful Create 正确保存。

提前感谢您提供的任何帮助!

4

1 回答 1

1

好的,这是由于这一行:

@ballot.preferences = @survey.questions.map{|question| question.preferences.build}

因为映射创建了一个不能被 Array 使用的form_helper(期望一个通常由 ActiveRecord 关系提供的模型名称)。

你应该坚持这样的事情:

@survey.questions.count.times { @ballot.preferences.build }

边注:

<% fields_for @ballot.preferences do |preferences_fields| %>

应该:

<%= f.fields_for :preferences do |preferences_field| %>
于 2011-07-11T21:43:09.050 回答