In the issue.rb I have mentioned:
has_many :relationships, :dependent => :d
I assume you are constructing the relationship in your controller and then trying to use it in the view. In order for this to be visible, you must make it an instance variable. All you need to do is throw an @ symbol in from of the name of relationship
, as you have done with @issue
.
@relationship = @issue.relationships.build
Edit: due to further information provided by the OP after the original question was asked, this answer is now clearly not applicable.
By using accepts_nested_attributes, you have created a setter method relationship_attributes=.
There are a couple of things I noticed that need to change.
You don't need to set
@relationship = @issue.relationships.build
Your form should be the following (you have f.fields_for :relationship)
= form_for @issue do |f|
# your issue fields here
= f.fields_for :relationships do |r|
# your relationship fields here
The beauty here is that you won't have to set any ids or anything.
Change this line
= f.fields_for :relationship do |builder|
to this:
= f.fields_for :relationships do |builder|
Your issue has_many relationships - plural. That will give you the correct relationships_attributes parameters.
Here is the working skeleton code: I created a new project and tried the combination of the other answers, and finally made it to work.
Here is my solution, after that are the things to watch out for. I am using different models so bear with me:
(model) discussion.rb
has_many :posts
accepts_nested_attributes_for :posts
(model) post.rb
belongs_to :discussion
routes.rb
resources :discussions do
resources :posts
end
(discussion view) _form.html.erb
<%= form_for(@discussion) do |f| %>
<%= f.fields_for :posts, @post do |p| %>
<%= p.text_area :content %>
<% end %>
<%= f.submit %>
<% end %>
(controller) 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
First, Thilo was right, I get unknown attribute: post if I do
# WRONG!
f.fields_for :post
Second, I have to have the @post instance variable in new action otherwise the post.context textarea will not show up.
# REQUIRED!
@post = @discussion.posts.build
Third, If I use the f.fields_for @post, the create action will complain unknown attribute: post too.
# WRONG!
f.fields_for @post do |p|
Use this instead:
# RIGHT!
f.fields_for :posts, @post do |p|
So yeah, I wish we get to see more documentations on this (can't see any useful ones). For example I see some use of form_for [@discussion, @post] but I can never get it to work.