【问题标题】:Rails 4 has_many association form not buildingRails 4 has_many关联表单未建立
【发布时间】:2014-04-25 21:51:17
【问题描述】:

也许我仍然不明白 Rails 4 如何与 has_many 和 belongs_to 关联一起工作。

我的表单没有保存 has_many 关系

入门模型

class Entry < ActiveRecord::Base
    belongs_to :survey
    has_many :answers, :dependent => :destroy
    accepts_nested_attributes_for :answers
end

答案模型

class Answer < ActiveRecord::Base
    belongs_to :entry
    validates :content, presence: true
    validates :entry_id, presence: true
end

入口控制器

def create
    @answer = Entry.create(params.require(:entry).permit(:survey_id, answers_attributes [:content, :entry_id]))
    redirect_to '/'
end

表格

<%= form_for(:entry, :url => {:controller => 'entrys', :action => 'create'}) do |q| %>
    <%= q.hidden_field :survey_id, :value => @survey.id %>
    <%= q.fields_for :answer do |a| %>
        <%= a.text_field :content %>
    <% end %>
    <%= q.submit :Save %>
<% end %>

调试错误

Parameters: {"utf8"=>"✓", "authenticity_token"=>"**********************=", "entry"=>{"survey_id"=>"1", "answer"=>{"content"=>"asdasd"}}, "commit"=>"Save"}
Unpermitted parameters: answer
(0.1ms)  begin transaction

提前致谢。

【问题讨论】:

    标签: ruby-on-rails-4 associations nested-attributes has-many


    【解决方案1】:

    在您的表单中更新fields_for,如下所示:

       <%= q.fields_for :answers do |a| %>
            <%= a.text_field :content %>
        <% end %>
    

    注意复数形式的:answers 而不是:answer。 由于 Entry 模型与 Answer 在 1-M 关系中关联,因此您应该在字段中使用复数 :answers。

    现在当您使用:answer(单数)时,rails 没有正确解释它,因此您在params 哈希中收到了answer 键,而不是收到answers_attributes,这显然导致警告为@987654332 @

    更新

    更新create 操作如下:

    def create
        @answer = Entry.create(params.require(:entry).permit(:survey_id, answers_attributes: [:content, :entry_id]))
        redirect_to '/'
    end
    

    应该是answers_attributes: [:content, :entry_id] 而不是answers_attributes [:content, :entry_id](注意缺少:)

    另外,我建议您更新您的入口控制器new 操作如下:

    def new
      @entry = Entry.new
      @entry.answers.build
    end
    

    此次更新后form_for如下:

    <%= form_for(@entry) do |q| %>
    

    注意:

    控制器名称不符合 Rails 约定,因此它弄乱了 params 哈希。你得到的不是entry 作为密钥,而是entrie。我建议将控制器名称 EntrysController 更改为 EntriesController。将文件 entrys_controller.rb 重命名为 entries_controller.rb。此外,通过将所有出现的entrys 替换为entries 来更新routes.rb 中特定于该控制器的路由

    【讨论】:

    • Kirti,感谢您的回答。通过复数 :answers 唯一的区别是错误消息中的“Unpermitted parameters: answer”现在显示为“Unpermitted parameters: answers”。
    • kirti 我已经按照你的建议做了,我将 form_for 更新为“@entry”,并在控制器中按照你的建议定义了“@entry”。这就是发生的事情:当我按照您告诉我的所有内容离开时,既没有提交条目也没有提交答案。但是当我删除“@entry.answers.build”时,只会提交条目。
    • 当我按照您的建议保留所有内容时,控制台会显示此内容:Parameters: {"utf8"=&gt;"✓", "authenticity_token"=&gt;"PlJA6FxSyDCdeqqLmrSM7P8xmKeYIbA3HFLQ18D8Xqo=", "entrie"=&gt;{"survey_id"=&gt;"1", "answers_attributes"=&gt;{"0"=&gt;{"content"=&gt;"asdasdasdasd"}}}, "commit"=&gt;"Actualizar"} (0.1ms) begin transaction (0.1ms) rollback transaction
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-17
    相关资源
    最近更新 更多