我在这里遇到的问题是我有一个嵌套的表单,它不会保存到数据库中,我怀疑它是因为在保存之前没有将正确的属性传递给表单。现在我正试图通过隐藏的字段传递这些值,但我认为可能有更多的“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”未正确保存到数据库中的问题。我是否必须通过隐藏的字段来执行此操作,还是必须执行其他操作,例如嵌套我的路线?
答案 0 :(得分:1)
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;的模型上。关系