This is a simpler version of a question I asked earlier that was
probably too long. I am trying to combine an array with fields_for, if
this is possible.
I have classes Account and Employee, with a many-to-many relationship.
I define a model class AccountEmployeeRelation to link the two. The
link class also contains an extra field called “role”.
I want to create an Account and assign employees in one form. (The
employees already exist). I have figured out how to add one employee
(not sure if this is the best way, but it works):
Controller:
def new
@account = Account.new
@r = AccountEmployeeRelation.new
end
def create
@account = Account.new(params[:account])
@r = AccountEmployeeRelation.new(params[:r])
@account.account_employee_relations << @r
@account.save
@r.save
redirect_to :action => :list
end
View, new.rhtml:
<% form_for :account, :url => { :action => :create } do |form| %>
Title: <%= form.text_field :title %><br/>
<% fields_for :r do |r|%>
Employee: <%= r.select (:employee_id, Employee.find(:all).map{|u|
[u.name, u.id]}) %><br/>
Role: <%= r.select (:role, ['Boss', 'King', 'Queen']) %>
<% end %>
<%= submit_tag %>
<% end %>
But how do I assign multiple employees in one form? I would guess that
‘new’ needs to look like: (up to 3 employees)
def new
@account = Account.new
@rs = []
3.times do
@rs << AccountEmployeeRelation.new
end
end
But the following does not work for the view. I get this error:
|`@#AccountEmployeeRelation:0xb7628038’ is not allowed as an instance
variable name|
<% for r in @rs %>
<% fields_for r do |f| %>
Employee: <%= f.select (:employee_id, Employee.find(:all).map{|u|
[u.name, u.id]}) %><br/>
Role: <%= f.select (:role, ['Boss', 'King', 'Queen']) %>
<% end %>
<% end %>
Any pointers are appreciated.