- 我有一个模型"问题"和一个嵌套模型"关系">
-
在 issue.rb 中,我提到了:
has_many :relationships, :dependent => :destroy accepts_nested_attributes_for :relationships, :allow_destroy => true
-
在关系.rb中,我提到过:
belongs_to :issue
-
在Ryan Bates Railcast#196之后,我的issues_controller中有以下内容:
relationship = @issue.relationships.build
但是,我遇到错误"未知属性:关系">
我在这里做错了什么吗?我确实在日志中看到关系属性被传递到服务器,但是,此错误不会让创建成功。
我在rails方面的专业知识是初学者水平,所以如果我问一个可能被认为是微不足道的问题,请原谅我。
感谢您的帮助。
编辑:相关的控制器代码:
@relationship = @issue.relationships.build
#@relationship = Relationship.new(params[:relationship])
if @relationship.issue_id = ''
@relationship.issue_id = @issueid
end
if @relationship.cause_id = ''
@relationship.cause_id = @issueid
end
@relationship.save
redirect_to(:back, :notice => 'New Relationship was created')
我在痕迹上看到的:
ActiveRecord::UnknownAttributeError in IssuesController#create
unknown attribute: relationship
在问题参数中,我看到关系参数按预期传递:
"relationship"=>{"issue_id"=>"100",
"cause_id"=>""}
另一个更新发布form_for代码:
- form_for Issue.new do |f|
.field
= f.text_field :description, :class=>"formfield", :id=>"frm_descr"
.field
= f.hidden_field :wiki_url, :class=>"formfield", :id=>"frm_wiki_url"
.field
= f.hidden_field :short_url, :class=>"formfield", :id=>"frm_img_url"
.field
= f.hidden_field :title, :class=>"formfield", :id=>"frm_title"
= f.fields_for :relationship do |builder|
= builder.text_field :issue_id, :class=>"form_field", :id=>"frm_rel_issue_id", :value=>@issue.id
= builder.text_field :cause_id, :class=>"form_field", :id=>"frm_rel_cause_id"
.actions
= f.submit 'Create', :class=>"save_button", :name=>"save_issue_rel_button", :id=>"val_collector"
更改此行
= f.fields_for :relationship do |builder|
对此:
= f.fields_for :relationships do |builder|
您的问题has_many关系 - 复数。这将为您提供正确的relationships_attributes参数。
以下是工作框架代码:我创建了一个新项目并尝试了其他答案的组合,最终使其工作。
这是我的解决方案,之后是需要注意的事情。我正在使用不同的模型,所以请耐心等待:
- 我的模型是:讨论has_many帖子。
- 讨论没有属性。
- 帖子有内容:文本和discussion_id:整数。
工作代码
(模型(讨论.rb
has_many :posts
accepts_nested_attributes_for :posts
(模型(邮政.rb
belongs_to :discussion
路线.rb
resources :discussions do
resources :posts
end
(讨论视图( _form.html.erb
<%= form_for(@discussion) do |f| %>
<%= f.fields_for :posts, @post do |p| %>
<%= p.text_area :content %>
<% end %>
<%= f.submit %>
<% end %>
(控制器( discussions_controller.rb
def new
@discussion = Discussion.new
@post = @discussion.posts.build
respond_to do |format|
format.html # new.html.erb
format.xml { render :xml => @discussion }
end
end
def create
@discussion = Discussion.new(params[:discussion])
respond_to do |format|
if @discussion.save
format.html { redirect_to(@discussion, :notice => 'Discussion was successfully created.') }
format.xml { render :xml => @discussion, :status => :created, :location => @discussion }
else
format.html { render :action => "new" }
format.xml { render :xml => @discussion.errors, :status => :unprocessable_entity }
end
end
end
可能出错的事情
首先,Thilo是对的,我得到未知的属性:如果我这样做,请发布
# WRONG!
f.fields_for :post
其次,我必须在新操作中使用@post实例变量,否则 post.context 文本区域将不会显示。
# REQUIRED!
@post = @discussion.posts.build
第三,如果我使用f.fields_for @post,创建操作会抱怨未知属性:帖子也是。
# WRONG!
f.fields_for @post do |p|
请改用这个:
# RIGHT!
f.fields_for :posts, @post do |p|
结束
所以是的,我希望我们能看到更多关于此的文档(看不到任何有用的文档(。例如,我看到一些form_for[@discussion,@post]的使用,但我永远无法让它工作。
通过使用accepts_nested_attributes,您已经创建了一个 setter 方法 relationship_attributes=。
我注意到有几件事需要改变。
您无需设置
@relationship = @issue.relationships.build
您的表单应如下所示(您有f.fields_for:关系(
= form_for @issue do |f|
# your issue fields here
= f.fields_for :relationships do |r|
# your relationship fields here
这里的美妙之处在于您不必设置任何 id 或任何东西。
我假设您正在控制器中构造关系,然后尝试在视图中使用它。为了使它可见,您必须使其成为实例变量。您需要做的就是从relationship
的名称中加入一个@符号,就像您对@issue
所做的那样。
@relationship = @issue.relationships.build
编辑:由于OP在提出原始问题后提供了进一步的信息,因此此答案现在显然不适用。