繁体   English   中英

NoMethodError使用Rails 4.0和带有茧的嵌套表单

[英]NoMethodError using Rails 4.0 and nested forms with cocoon

我正在学习使用Rails 4.0,并且正在使用Cocoon为简单的轮询应用程序创建嵌套表单。

用户应该能够添加一个新问题,然后添加任意数量的答案。

我已经使用了嵌套表单,但是当我尝试保存投票时,却收到一个错误,提示NoMethodError in PollsController#create - undefined method ``answer' for #<Poll:0x007fba59a70dd0>

这是我的Polls_Controller的相关信息:

before_action :set_poll, only: [:show, :edit, :update, :destroy]

def create
    @poll = Poll.new(poll_params)

    respond_to do |format|
      if @poll.save
        format.html { redirect_to @poll, notice: 'Poll was successfully created.' }
        format.json { render :show, status: :created, location: @poll }
      else
        format.html { render :new }
        format.json { render json: @poll.errors, status: :unprocessable_entity }
      end
    end
  end

private
def poll_params
  params.require(:poll).permit(:question, :expires, answers_attributes: [:id, :answer, :_destroy])
end

投票模型

class Poll < ActiveRecord::Base
    has_many :answers, :class_name => "Answer"

    accepts_nested_attributes_for :answers, reject_if: :all_blank, allow_destroy: true

    validates :answer, presence: true
end

和答案模型

class Answer < ActiveRecord::Base
  belongs_to :poll
end

这是两个.erb部分,分别包含“投票”形式和“答案”(嵌套)形式。

_form.html.erb

<%= form_for(@poll) do |f| %>
  <% if @poll.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@poll.errors.count, "error") %> prohibited this poll from being saved:</h2>

      <ul>
      <% @poll.errors.full_messages.each do |message| %>
        <li><%= message %></li>
      <% end %>
      </ul>
    </div>
  <% end %> 

  <div class="form-group">
    <%= f.label :question %><br>
    <%= f.text_field :question, class: "form-control" %>
  </div>

    <div class="form-group" id="answers">
      <%= f.fields_for :answers do |answer| %>
        <%= render 'answer_fields', f: answer %>
      <% end %>  
        <div class="links">
          <%= link_to_add_association 'Add Answer', f, :answers, class: "btn btn-default add-button" %>
        </div>

    </div>

    <div class="form-group">
      <%= f.label :expires %><br>
      <%= f.datetime_select :expires %>
    </div>

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

_answer.html.erb

<div class="nested-fields form-group">
      <div class="field">
    <%= f.label :answer %>
    <br/>
    <%= f.text_field :answer, class: "form-control" %>
  </div>
  <%= link_to_remove_association "remove answer", f, class: "form-button btn btn-default" %>
</div>

我一直盯着这个问题已经太久了,尽管这是一个简单的主意,但我的大脑没有看到这个问题。 有任何想法吗?

编辑这是我的模式

ActiveRecord::Schema.define(version: 20151104213600) do

  create_table "answers", force: :cascade do |t|
    t.text     "answer"
    t.integer  "poll_id"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end

  add_index "answers", ["poll_id"], name: "index_answers_on_poll_id"

  create_table "polls", force: :cascade do |t|
    t.string   "question"
    t.datetime "expires"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end

end

我本人已经遇到了这个问题,并且通过预先建立关联的关系,它像一种魅力一样工作,可以这样做:

def new
  @poll = Poll.new
  @poll.answers.build
end

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM