Ruby on rails 如何将这个嵌套表单保存在Rails 4中,并具有多个直通关联?
我在这里遇到的问题是,我有一个嵌套表单无法保存到数据库中,我怀疑这是因为在保存之前没有将正确的属性传递到表单中。现在我正试图通过隐藏字段传递这些值,但我认为可能有一种更“Railsy”的方法来实现这一点。这是我为此创建的表单: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
<%= 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”}
应该可以工作。