Ruby on rails 如何将这个嵌套表单保存在Rails 4中,并具有多个直通关联?

Ruby on rails 如何将这个嵌套表单保存在Rails 4中,并具有多个直通关联?,ruby-on-rails,ruby,forms,Ruby On Rails,Ruby,Forms,我在这里遇到的问题是,我有一个嵌套表单无法保存到数据库中,我怀疑这是因为在保存之前没有将正确的属性传递到表单中。现在我正试图通过隐藏字段传递这些值,但我认为可能有一种更“Railsy”的方法来实现这一点。这是我为此创建的表单: <%= form_for @topic do |f| %> <%= render "shared/error_messages", object: f.object %> <%= f.fields_for :subject

我在这里遇到的问题是,我有一个嵌套表单无法保存到数据库中,我怀疑这是因为在保存之前没有将正确的属性传递到表单中。现在我正试图通过隐藏字段传递这些值,但我认为可能有一种更“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 %>
这是我的
user.rb的型号:

class User < ActiveRecord::Base
    has_many :topics
    has_many :subjects, through: :topics
end
在我的
topic.rb
文件中:

class Subject < ActiveRecord::Base
    has_many :topics
    has_many :users, through: :topics, dependent: :destroy
    validates :name, presence: true
end
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
类主题
所以我离成功提交表格越来越近了!我将
接受
的\u嵌套的\u属性\u方法放置在联接模型中,在本例中,该模型位于
topic.rb
中。我真的不知道为什么会这样,但我认为它允许Rails正确设置“:user\u id”和“:subject\u id”,而不是在包含“has\u many through”关系的模型上放置
接受
的嵌套属性。我在这篇帖子上看到了,顺便说一句:


现在,我仍然有一个问题:subject_id没有正确地保存到数据库中。我需要通过一个隐藏的字段来完成这项工作,还是需要做一些其他的事情,比如筑巢我的路线?

哇,花了很长时间才弄明白这一点。因为我有一个多通关系,我正试图创建一个包含其中一个模型的嵌套表单,所以我遇到的问题是我放置了“accepts\u nested\u attributes\u for”在错误的模型中,我将其放置在
subject.rb
文件中的has_many-through模型中,而它本应放置在负责两个表之间连接的模型中

另外,当我试图保存“:subject_id”时,我在这一行犯了一个超级愚蠢的错误。我写的是:
@topic.subject\u id=params[:subject\u id][:id]
,而不是这样的东西:

{"utf8"=>"✓", "authenticity_token"=>"PdxVyZa3X7Sc6mjjQy1at/Ri7NpR4IPUzW09Fs8I710=", "subject"=>{"id"=>"5"}, "topic"=>{"name"=>"Ruby"}, "commit"=>"Create Topic", "action"=>"create", "controller"=>"topics"}
@topic.subject_id = params[:subject][:id]
这真是一个愚蠢的错误(可能是因为我从另一个控制器复制了一个粘贴代码哈哈)


无论如何,我希望其他人能够从我的错误中吸取教训,如果他们想要在具有“has_many through”关系的模型上执行嵌套表单,在某些情况下,“accepts_nested_attributes_for”方法将出现在连接表上,而不是具有“has_many through”关系的模型上

您能解释一下这行“@subject.topics.build”吗?很抱歉,我对Rails 4非常陌生。如果删除
,会发生什么。该行应该由
接受
的嵌套属性处理。将
subject\u id
的值设置为
params[:topic]
看起来也是错误的。@Pavan该行只是通过关联和路由创建了一个新的主题实例,我wrote@jvnill你认为你可以看看我的修订版,以及我如何通过“:subject_id”考试吗那么它会被保存到数据库中吗?你不需要主题的
字段。一个简单的
f.collection\u select:subject\u id,subject.all,:id,:name,{prompt:“select A subject”}
应该可以工作。