如何在Rails 4中保存这个嵌套的表单,并且有很多关联?

时间:2014-03-26 02:59:05

标签: ruby-on-rails ruby forms

我在这里遇到的问题是我有一个嵌套的表单,它不会保存到数据库中,我怀疑它是因为在保存之前没有将正确的属性传递给表单。现在我正试图通过隐藏的字段传递这些值,但我认为可能有更多的“Railsy”方法来做到这一点。这是我创建的表单:

<%= form_for @topic do |f| %>

    <%= render "shared/error_messages", object: f.object %>

    <%= f.fields_for :subject do |s| %>

        <%= s.label :name, "Subject" %>
        <%= collection_select :subject, :id, Subject.all, :id, :name, {prompt:"Select a subject"} %>

    <% end %>

    <%= f.label :name, "Topic" %>
    <%= f.text_field :name %>

    <div class="text-center"><%= f.submit class: "button radius" %></div>

<% end %>

此表单生成一个params哈希,如下所示:

{"utf8"=>"✓", "authenticity_token"=>"PdxVyZa3X7Sc6mjjQy1at/Ri7NpR4IPUzW09Fs8I710=", "subject"=>{"id"=>"5"}, "topic"=>{"name"=>"Ruby"}, "commit"=>"Create Topic", "action"=>"create", "controller"=>"topics"}

这是我user.rb的模型:

class User < ActiveRecord::Base
    has_many :topics
    has_many :subjects, through: :topics
end

在我的subject.rb文件中:

class Subject < ActiveRecord::Base
    has_many :topics
    has_many :users, through: :topics, dependent: :destroy
    validates :name, presence: true
end

在我的topic.rb文件中:

class Topic < ActiveRecord::Base
    belongs_to :subject
    belongs_to :user
    accepts_nested_attributes_for :subject
    validates :name, presence: true
end

class TopicsController < ApplicationController
    before_filter :require_login

    def new
        @topic = Topic.new
        @topic.build_subject
    end

    def create
        @topic = Topic.new(topic_params)
        @topic.user_id = current_user.id
        @topic.subject_id = params[:subject][:id]
        if @topic.save
            flash[:success] = "Success!"
            render :new
        else
            flash[:error] = "Error!"
            render :new
        end
    end

    private
    def topic_params
        params.require(:topic).permit(:name,:subject_id,:user_id, subjects_attributes: [:name])
    end
end

所以我越来越接近成功提交表格了!我将方法accepts_nested_attributes_for放在连接模型中,在本例中是topic.rb。我真的不知道为什么这有效,但我认为它允许Rails正确设置“:user_id”和“:subject_id”,而不是将accepts_nested_attributes_for放在包含“has_many through”关系的模型上。我在这篇文章上看到了它:http://makandracards.com/makandra/1346-popular-mistakes-when-using-nested-forms

现在,我仍然遇到“:subject_id”未正确保存到数据库中的问题。我是否必须通过隐藏的字段来执行此操作,还是必须执行其他操作,例如嵌套我的路线?

1 个答案:

答案 0 :(得分:1)

哇哇哇哇哇哇哇哇哇哇哇哇哇。由于我有一个has_many通过关系,并且我试图创建一个涉及这些模型之一的嵌套表单,我遇到的问题是我放置了&#34; accepts_nested_attributes_for&#34;在错误的模型中,我将它放在subject.rb文件中的has_many through模型中,它应该放在负责两个表之间连接的模型中。

当我试图保存&#34;:subject_id&#34;时,我在这一行上犯了一个超级愚蠢的错误。我这样写:@topic.subject_id = params[:subject_id][:id]而不是像这样:

@topic.subject_id = params[:subject][:id]

这是一个非常愚蠢的错误(可能是因为我正在复制另一个控制器的粘贴代码哈哈)

无论如何我希望其他人可以从我的错误中吸取教训,如果他们想要在带有&#34; has_many到&#34;的模型上做嵌套表格的话。关系,在某些情况下,&#34; accepts_nested_attributes_for&#34;方法将在JOIN表上进行,而不是在&#34; has_many到&#34;的模型上。关系