Context sensitive edit/new action

I have the following associations:

Entity
has_one :client_role

ClientRole
belongs_to :entity

There should be two ways to add a client role, one where the entity
exists and one where the entity does not.

In the case where the entity does not exist I have wired the client
controller to initialize an entity and an entity.client, populate both
from client/new, and add both via client/create. This works.

Here is my problem.

The client/edit method can logically be reached either from
clients/index (client role exists) or from entities/index (client role
may or may not exist). However, the :id passed via params in each case
refers to a different model, client and entity respectively. Ideally,
when calling from entities/index where no client role exists I should
call new_client_path. However, new in this sense implies an existing
entity, something that I cannot pass via new_client_path and which would
not be understood by clients_controller.new as written in any case.

Basically, what I must do is detect what model the :id passed belongs
too in edit and set up the necessary objects dependent upon that
determination. Or, I have to call a method so that this determination
is already satisfied. I cannot simply find against both models inside
the controller and see which one fails since it is possible that the
edit call is for an existing client role. Further, when a new client
role is required the entity id: passed might refer to an entirely
different client role which then would be returned in error.

Is this a case where I need a separate controller and special entry in
the routes file to handle this need?

map.resources :clients

map.resources :entities do |entity|
entity.resources :client, :controller => ?, :method =>
edit/new?
end

Thanks in advance for any assistance offered.

James B. wrote:

I have the following associations:

Entity
has_one :client_role

ClientRole
belongs_to :entity

I have this in my config/routes

map.resources :clients do |client|
# A client role has only one entity.
client.resource :entity
end

map.resources :entities do |entity|
# An entity can only have one client role
entity.resource :client
entity.resources :locations
# And only one vendor role
entity.resource :vendor
end

And rake routes gives me this:


new_entity_client GET /entities/:entity_id/client/new
{:action=>“new”, :controller=>“clients”}
formatted_new_entity_client GET
/entities/:entity_id/client/new.:format {:action=>“new”,
:controller=>“clients”}
edit_entity_client GET /entities/:entity_id/client/edit
{:action=>“edit”, :controller=>“clients”}
formatted_edit_entity_client GET
/entities/:entity_id/client/edit.:format {:action=>“edit”,
:controller=>“clients”}
entity_client GET /entities/:entity_id/client
{:action=>“show”, :controller=>“clients”}
formatted_entity_client GET
/entities/:entity_id/client.:format {:action=>“show”,
:controller=>“clients”}
PUT /entities/:entity_id/client
{:action=>“update”, :controller=>“clients”}
PUT
/entities/:entity_id/client.:format {:action=>“update”,
:controller=>“clients”}
DELETE /entities/:entity_id/client
{:action=>“destroy”, :controller=>“clients”}
DELETE
/entities/:entity_id/client.:format {:action=>“destroy”,
:controller=>“clients”}

But if I write this in views/entities/index

33 <%- if entity.client.nil? -%>
34 <%= link_to ‘Add Client Role’, new_entity_client(entity)
-%>
36

Then I see this:

NoMethodError in Entities#index

Showing entities/index.html.erb where line #34 raised:

undefined method `new_entity_client’ for #ActionView::Base:0xb793f9d8

app/views/entities/index.html.erb:34:in
_run_erb_47app47views47entities47index46html46erb' app/views/entities/index.html.erb:11:ineach’
app/views/entities/index.html.erb:11:in
_run_erb_47app47views47entities47index46html46erb' app/controllers/entities_controller.rb:13:inindex’

and params contains nil.

I am somewhat confused at this point. Rakes routes shows that
new_entity_client is defined and Rails says that it is not. Can anyone
point me in the right direction?

This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.

| Privacy Policy | Terms of Service | Remote Ruby Jobs