[英]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.