Passing an instance of one object to another

Hello,

I’m working on my first Rails app. It’s a redesign for a magazine
site. I have a class for the articles and a class for issues. I’ve
set up a has_many/belongs_to relationship between the two so that
every article belongs to a particular issue.

Now I’d like to set it up so that a new article cannot be added UNLESS
you have already chosen the issue that it is to be added to. I’d like
to set something up like
“selected_issue.articles.build(params[:article])” but I don’t know how
to create an action/method that would allow me to set the
selected_issue variable and then pass that into the create method on
the article controller.

Could someone lend some assistance here?

Thanks.

you got it right. you can call
@issue.articles.create( params[:article] ) to get a new article that
is already saved and associated with the issue. you can also do
@issue.articles.build( params[:article] ) if you want to get a new
article object but not save it yet.

see here:
http://api.rubyonrails.com/classes/ActiveRecord/Associations/ClassMethods.html#M000642

On 9/19/07, skoppy [email protected] wrote:

to set something up like
“selected_issue.articles.build(params[:article])” but I don’t know how
to create an action/method that would allow me to set the
selected_issue variable and then pass that into the create method on
the article controller.

A common way to do this is for your “create article” form to have a
select field for issue_id that allows the user to select from
available issues.

In your view:

<% form_for :article do |f| %>
<% select :issue_id, Issue.find(:all).collect {|p| [ p.name, p.id
] } %>

<% end %>

Then in your controller,

@article = new Article(params[:article])
if @article.save
…blah blah

This will automatically assign the article to the selected issue.

If you want to ensure that the article is linked to a valid issue, add
to your model:

class Article < ActiveRecord::Base
belongs_to :issue
validates_presence_of :issue
end