Hello,
I''m encountering a very strange issue and I''ve identified
behavior I
don''t quite understand. I have a design in which a "full
model" exists
with sub-screens for each of the pages worth of data input. Each screen
goes through validation, and then updates the overall model with the
validated input, as well as saving the screen''s information to a
specific "screen" table.
For instance:
class FullQuoteHoModel < ActiveRecord::Base
has_one :full_quote_ho
has_one :full_quote_ho_loc
has_one :full_quote_ho_cov
has_one :full_quote_ho_additional_coverage
end
class FullQuoteHo < ActiveRecord::Base
belongs_to :full_quote_ho_model
end
class FullQuoteHoLoc < ActiveRecord::Base
belongs_to :full_quote_ho_model
end
class FullQuoteHoCov < ActiveRecord::Base
belongs_to :full_quote_ho_model
end
class FullQuoteHoAdditionalCoverage < ActiveRecord::Base
belongs_to :full_quote_ho_model
end
FullQuoteHoModel is the "entire" model, with each of the others as
"sub-screens" that accept inputs, validate them, save the values to
their tables, and also update the accepted, validated inputs into the
"entire" model.
I only want index/show/new/destroy in the FullQuoteHoModel, and I only
want new/create/edit/update in the sub-screens. I do this in the routes
file as follows:
map.resources :full_quote_ho_models, :except => [:edit, :update,
:create], :requirements => {:id => /[0-9]+/} do |full_quote_ho_model|
full_quote_ho_model.resources :full_quote_ho_additional_coverages,
:only => [:new, :create, :edit, :update], :requirements => {:id =>
/[0-9]+/}, :name_prefix => nil
full_quote_ho_model.resources :full_quote_ho_covs, :only => [:new,
:create, :edit, :update], :requirements => {:id => /[0-9]+/},
:name_prefix => nil
full_quote_ho_model.resources :full_quote_ho_locs, :only => [:new,
:create, :edit, :update], :requirements => {:id => /[0-9]+/},
:name_prefix => nil
full_quote_ho_model.resources :full_quote_hos, :only => [:new,
:create, :edit, :update], :requirements => {:id => /[0-9]+/},
:name_prefix => nil
end
Now, when I create a new full quote ho model from the FullQuoteHoModel
index screen, I can create each of the screens just fine, as well as the
overall model (for testing purposes, there is no validation above, so I
create empty records that are assigned system-generated IDs).
When I access any screen from the FullQuoteHoModel, if it has the same
ID path as the FullQuoteHoModel, things show up and work as intended.
However, if the ID of the screen is not the same as the
FullQuoteHoModel, then I receive the following error:
ActionController::RoutingError in Full_quote_hos#edit
Showing app/views/full_quote_hos/edit.html.erb where line #3 raised:
full_quote_ho_url failed to generate from {:action=>"update",
:full_quote_ho_model_id=>#<FullQuoteHo id: 4, inception_date:
"",
building_construction: nil, protection_class: nil, territory: "",
policy_form: "", replacement_cost_on_contents: "",
occupancy_type: "",
building_type: "", applicants_first_name: "",
applicants_middle_initial:
"", applicants_last_name: "", applicants_date_of_birth:
"",
applicants_ssn: "", coapplicants_first_name: "",
coapplicants_middle_initial: "", coapplicants_last_name: "",
coapplicants_date_of_birth: "", coapplicants_ssn: "",
property_address_1: "", property_address_2: "",
property_zip_code: "",
property_county: "", property_city: "", property_state:
"",
property_city_limits: "", property_address_how_long: "",
mailing_address_1: "", mailing_address_2: "",
mailing_zip_code: "",
mailing_county: "", mailing_city: "", mailing_state:
"",
previous_address_1: "", previous_address_2: "",
previous_zip_code: "",
previous_county: "", previous_city: "", previous_state:
"",
currently_insured: "", current_carrier: "", created_at:
"2009-06-23
05:45:03", updated_at: "2009-06-23 05:45:03",
full_quote_ho_model_id:
3>, :controller=>"full_quote_hos"}, expected:
{:action=>"update",
:controller=>"full_quote_hos"}, diff:
{:full_quote_ho_model_id=>#<FullQuoteHo id: 4, inception_date:
"",
building_construction: nil, protection_class: nil, territory: "",
policy_form: "", replacement_cost_on_contents: "",
occupancy_type: "",
building_type: "", applicants_first_name: "",
applicants_middle_initial:
"", applicants_last_name: "", applicants_date_of_birth:
"",
applicants_ssn: "", coapplicants_first_name: "",
coapplicants_middle_initial: "", coapplicants_last_name: "",
coapplicants_date_of_birth: "", coapplicants_ssn: "",
property_address_1: "", property_address_2: "",
property_zip_code: "",
property_county: "", property_city: "", property_state:
"",
property_city_limits: "", property_address_how_long: "",
mailing_address_1: "", mailing_address_2: "",
mailing_zip_code: "",
mailing_county: "", mailing_city: "", mailing_state:
"",
previous_address_1: "", previous_address_2: "",
previous_zip_code: "",
previous_county: "", previous_city: "", previous_state:
"",
currently_insured: "", current_carrier: "", created_at:
"2009-06-23
05:45:03", updated_at: "2009-06-23 05:45:03",
full_quote_ho_model_id:
3>}
Extracted source (around line #3):
1: <h1>Editing Full Quote Homeowners: Basic Information</h1>
2:
3: <% form_for(@full_quote_ho) do |f| %>
4: <%= error_messages_for :full_quote_ho, :header_message =>
"#{@full_quote_ho.errors.count} validation errors prohibited this Full
Quote Screen from being validated.", :message => "Please correct
the
fields in red and try again." %>
5:
This is an issue because currently, a user can create a new
FullQuoteHoModel, fill out two screens, then hit Back and go to the
FullQuoteHoModel index, maybe create a new FullQuoteHoModel, fill out
all screens, then decide to return to the first one and create the
remaining two screens. The IDs are then out of sync (which isn''t
unintended behavior - technically speaking, no matter what the ID of the
screen, it belongs to one and only one FullQuoteHoModel) and trying to
go back and edit that screen doesn''t show up. Is this a routing issue
(the generated URLs, maybe)? Or something else?
The index page shows the ability to create or edit screens as follows
per FullQuoteHoModel record:
<% @full_quote_ho_models.each do |full_quote_ho_model| %>
<tr>
<td><%=h full_quote_ho_model.inception_date %></td>
<td><%=h full_quote_ho_model.policy_form %></td>
<td><%=h full_quote_ho_model.applicants_first_name
%></td>
<td><%=h full_quote_ho_model.applicants_middle_initial
%></td>
<td><%=h full_quote_ho_model.applicants_last_name
%></td>
<td><%=h full_quote_ho_model.applicants_ssn %></td>
<td><%=h full_quote_ho_model.property_address_1 %></td>
<td><%=h full_quote_ho_model.property_address_2 %></td>
<td><%=h full_quote_ho_model.property_zip_code %></td>
<td><%=h full_quote_ho_model.property_county %></td>
<td><%=h full_quote_ho_model.property_city %></td>
<td><%=h full_quote_ho_model.property_state %></td>
</tr>
<tr>
<td colspan="1"><%= link_to ''Show'',
full_quote_ho_model %></td>
<% if full_quote_ho_model.full_quote_ho != nil %>
<td colspan="2"><%= link_to ''Edit Basic
Information'',
edit_full_quote_ho_path(full_quote_ho_model.id,
full_quote_ho_model.full_quote_ho.id) %></td>
<% else %>
<td colspan="2"><%= link_to ''Continue Basic
Information'',
new_full_quote_ho_path(full_quote_ho_model.id) %></td>
<% end %>
<% if full_quote_ho_model.full_quote_ho_loc != nil %>
<td colspan="2"><%= link_to ''Edit
Locations'',
edit_full_quote_ho_loc_path(full_quote_ho_model.id,
full_quote_ho_model.full_quote_ho_loc.id) %></td>
<% else %>
<td colspan="2"><%= link_to ''Continue
Locations'',
new_full_quote_ho_loc_path(full_quote_ho_model.id) %></td>
<% end %>
<% if full_quote_ho_model.full_quote_ho_cov != nil %>
<td colspan="2"><%= link_to ''Edit
Coverages'',
edit_full_quote_ho_cov_path(full_quote_ho_model.id,
full_quote_ho_model.full_quote_ho_cov.id) %></td>
<% else %>
<td colspan="2"><%= link_to ''Continue
Coverages'',
new_full_quote_ho_cov_path(full_quote_ho_model.id) %></td>
<% end %>
<% if full_quote_ho_model.full_quote_ho_additional_coverage != nil
%>
<td colspan="2"><%= link_to ''Edit Additional
Coverages'',
edit_full_quote_ho_additional_coverage_path(full_quote_ho_model.id,
full_quote_ho_model.full_quote_ho_additional_coverage.id) %></td>
<% else %>
<td colspan="2"><%= link_to ''Continue
Additional Coverages'',
new_full_quote_ho_additional_coverage_path(full_quote_ho_model.id)
%></td>
<% end %>
<td colspan="1"><%= link_to
''Destroy'', full_quote_ho_model,
:confirm => ''Are you sure?'', :method => :delete
%></td>
</tr>
If I try and alter the generated URLs to not include IDs, I receive
errors. I know the ordering of the IDs is appropriate. The pathing
should be as it currently is: /full_quote_ho_models/#/full_quote_ho/# or
/full_quote_ho_models/#/full_quote_ho_locs/#, etc.
Has anyone seen this behavior before?
--
Posted via http://www.ruby-forum.com/.
Have you tried explicitly setting the URL to post to in the form_for? From the trace, it looks like it''s trying to generate a route to edit_full_quote_ho without specifying the parent model. [@full_quote_ho_model, @full_quote_ho] might work as well. --Matt Jones On Jun 23, 2:02 am, Ahad Amdani <rails-mailing-l...-ARtvInVfO7ksV2N9l4h3zg@public.gmane.org> wrote:> Hello, > > I''m encountering a very strange issue and I''ve identified behavior I > don''t quite understand. I have a design in which a "full model" exists > with sub-screens for each of the pages worth of data input. Each screen > goes through validation, and then updates the overall model with the > validated input, as well as saving the screen''s information to a > specific "screen" table. > > For instance: > > class FullQuoteHoModel < ActiveRecord::Base > has_one :full_quote_ho > has_one :full_quote_ho_loc > has_one :full_quote_ho_cov > has_one :full_quote_ho_additional_coverage > > end > > class FullQuoteHo < ActiveRecord::Base > belongs_to :full_quote_ho_model > end > > class FullQuoteHoLoc < ActiveRecord::Base > belongs_to :full_quote_ho_model > end > > class FullQuoteHoCov < ActiveRecord::Base > belongs_to :full_quote_ho_model > end > > class FullQuoteHoAdditionalCoverage < ActiveRecord::Base > belongs_to :full_quote_ho_model > end > > FullQuoteHoModel is the "entire" model, with each of the others as > "sub-screens" that accept inputs, validate them, save the values to > their tables, and also update the accepted, validated inputs into the > "entire" model. > > I only want index/show/new/destroy in the FullQuoteHoModel, and I only > want new/create/edit/update in the sub-screens. I do this in the routes > file as follows: > > map.resources :full_quote_ho_models, :except => [:edit, :update, > :create], :requirements => {:id => /[0-9]+/} do |full_quote_ho_model| > full_quote_ho_model.resources :full_quote_ho_additional_coverages, > :only => [:new, :create, :edit, :update], :requirements => {:id => > /[0-9]+/}, :name_prefix => nil > full_quote_ho_model.resources :full_quote_ho_covs, :only => [:new, > :create, :edit, :update], :requirements => {:id => /[0-9]+/}, > :name_prefix => nil > full_quote_ho_model.resources :full_quote_ho_locs, :only => [:new, > :create, :edit, :update], :requirements => {:id => /[0-9]+/}, > :name_prefix => nil > full_quote_ho_model.resources :full_quote_hos, :only => [:new, > :create, :edit, :update], :requirements => {:id => /[0-9]+/}, > :name_prefix => nil > end > > Now, when I create a new full quote ho model from the FullQuoteHoModel > index screen, I can create each of the screens just fine, as well as the > overall model (for testing purposes, there is no validation above, so I > create empty records that are assigned system-generated IDs). > > When I access any screen from the FullQuoteHoModel, if it has the same > ID path as the FullQuoteHoModel, things show up and work as intended. > However, if the ID of the screen is not the same as the > FullQuoteHoModel, then I receive the following error: > > ActionController::RoutingError in Full_quote_hos#edit > > Showing app/views/full_quote_hos/edit.html.erb where line #3 raised: > > full_quote_ho_url failed to generate from {:action=>"update", > :full_quote_ho_model_id=>#<FullQuoteHo id: 4, inception_date: "", > building_construction: nil, protection_class: nil, territory: "", > policy_form: "", replacement_cost_on_contents: "", occupancy_type: "", > building_type: "", applicants_first_name: "", applicants_middle_initial: > "", applicants_last_name: "", applicants_date_of_birth: "", > applicants_ssn: "", coapplicants_first_name: "", > coapplicants_middle_initial: "", coapplicants_last_name: "", > coapplicants_date_of_birth: "", coapplicants_ssn: "", > property_address_1: "", property_address_2: "", property_zip_code: "", > property_county: "", property_city: "", property_state: "", > property_city_limits: "", property_address_how_long: "", > mailing_address_1: "", mailing_address_2: "", mailing_zip_code: "", > mailing_county: "", mailing_city: "", mailing_state: "", > previous_address_1: "", previous_address_2: "", previous_zip_code: "", > previous_county: "", previous_city: "", previous_state: "", > currently_insured: "", current_carrier: "", created_at: "2009-06-23 > 05:45:03", updated_at: "2009-06-23 05:45:03", full_quote_ho_model_id: > 3>, :controller=>"full_quote_hos"}, expected: {:action=>"update", > :controller=>"full_quote_hos"}, diff: > {:full_quote_ho_model_id=>#<FullQuoteHo id: 4, inception_date: "", > building_construction: nil, protection_class: nil, territory: "", > policy_form: "", replacement_cost_on_contents: "", occupancy_type: "", > building_type: "", applicants_first_name: "", applicants_middle_initial: > "", applicants_last_name: "", applicants_date_of_birth: "", > applicants_ssn: "", coapplicants_first_name: "", > coapplicants_middle_initial: "", coapplicants_last_name: "", > coapplicants_date_of_birth: "", coapplicants_ssn: "", > property_address_1: "", property_address_2: "", property_zip_code: "", > property_county: "", property_city: "", property_state: "", > property_city_limits: "", property_address_how_long: "", > mailing_address_1: "", mailing_address_2: "", mailing_zip_code: "", > mailing_county: "", mailing_city: "", mailing_state: "", > previous_address_1: "", previous_address_2: "", previous_zip_code: "", > previous_county: "", previous_city: "", previous_state: "", > currently_insured: "", current_carrier: "", created_at: "2009-06-23 > 05:45:03", updated_at: "2009-06-23 05:45:03", full_quote_ho_model_id: > 3>} > > Extracted source (around line #3): > > 1: <h1>Editing Full Quote Homeowners: Basic Information</h1> > 2: > 3: <% form_for(@full_quote_ho) do |f| %> > 4: <%= error_messages_for :full_quote_ho, :header_message => > "#{@full_quote_ho.errors.count} validation errors prohibited this Full > Quote Screen from being validated.", :message => "Please correct the > fields in red and try again." %> > 5: > > This is an issue because currently, a user can create a new > FullQuoteHoModel, fill out two screens, then hit Back and go to the > FullQuoteHoModel index, maybe create a new FullQuoteHoModel, fill out > all screens, then decide to return to the first one and create the > remaining two screens. The IDs are then out of sync (which isn''t > unintended behavior - technically speaking, no matter what the ID of the > screen, it belongs to one and only one FullQuoteHoModel) and trying to > go back and edit that screen doesn''t show up. Is this a routing issue > (the generated URLs, maybe)? Or something else? > > The index page shows the ability to create or edit screens as follows > per FullQuoteHoModel record: > > <% @full_quote_ho_models.each do |full_quote_ho_model| %> > <tr> > <td><%=h full_quote_ho_model.inception_date %></td> > <td><%=h full_quote_ho_model.policy_form %></td> > <td><%=h full_quote_ho_model.applicants_first_name %></td> > <td><%=h full_quote_ho_model.applicants_middle_initial %></td> > <td><%=h full_quote_ho_model.applicants_last_name %></td> > <td><%=h full_quote_ho_model.applicants_ssn %></td> > <td><%=h full_quote_ho_model.property_address_1 %></td> > <td><%=h full_quote_ho_model.property_address_2 %></td> > <td><%=h full_quote_ho_model.property_zip_code %></td> > <td><%=h full_quote_ho_model.property_county %></td> > <td><%=h full_quote_ho_model.property_city %></td> > <td><%=h full_quote_ho_model.property_state %></td> > </tr> > <tr> > <td colspan="1"><%= link_to ''Show'', full_quote_ho_model %></td> > > <% if full_quote_ho_model.full_quote_ho != nil %> > <td colspan="2"><%= link_to ''Edit Basic Information'', > edit_full_quote_ho_path(full_quote_ho_model.id, > full_quote_ho_model.full_quote_ho.id) %></td> > <% else %> > <td colspan="2"><%= link_to ''Continue Basic Information'', > new_full_quote_ho_path(full_quote_ho_model.id) %></td> > <% end %> > > <% if full_quote_ho_model.full_quote_ho_loc != nil %> > <td colspan="2"><%= link_to ''Edit Locations'', > edit_full_quote_ho_loc_path(full_quote_ho_model.id, > full_quote_ho_model.full_quote_ho_loc.id) %></td> > <% else %> > <td colspan="2"><%= link_to ''Continue Locations'', > new_full_quote_ho_loc_path(full_quote_ho_model.id) %></td> > <% end %> > > <% if full_quote_ho_model.full_quote_ho_cov != nil %> > <td colspan="2"><%= link_to ''Edit Coverages'', > edit_full_quote_ho_cov_path(full_quote_ho_model.id, > full_quote_ho_model.full_quote_ho_cov.id) %></td> > <% else %> > <td colspan="2"><%= link_to ''Continue Coverages'', > new_full_quote_ho_cov_path(full_quote_ho_model.id) %></td> > <% end %> > > <% if full_quote_ho_model.full_quote_ho_additional_coverage != nil > %> > <td colspan="2"><%= link_to ''Edit Additional Coverages'', > edit_full_quote_ho_additional_coverage_path(full_quote_ho_model.id, > full_quote_ho_model.full_quote_ho_additional_coverage.id) %></td> > <% else %> > <td colspan="2"><%= link_to ''Continue Additional Coverages'', > new_full_quote_ho_additional_coverage_path(full_quote_ho_model.id) > %></td> > <% end %> > > <td colspan="1"><%= link_to ''Destroy'', full_quote_ho_model, > :confirm => ''Are you sure?'', :method => :delete %></td> > </tr> > > If I try and alter the generated URLs to not include IDs, I receive > errors. I know the ordering of the IDs is appropriate. The pathing > should be as it currently is: /full_quote_ho_models/#/full_quote_ho/# or > /full_quote_ho_models/#/full_quote_ho_locs/#, etc. > > Has anyone seen this behavior before? > -- > Posted viahttp://www.ruby-forum.com/.
Matt Jones wrote:> Have you tried explicitly setting the URL to post to in the form_for? > From the trace, it looks like it''s trying to generate a route to > edit_full_quote_ho without specifying the parent model. > [@full_quote_ho_model, @full_quote_ho] might work as well. > > --Matt Jones > > > On Jun 23, 2:02�am, Ahad Amdani <rails-mailing-l...-ARtvInVfO7ksV2N9l4h3zg@public.gmane.org>No, I haven''t tried explicitly setting the URL. I''m trying to do this the proper way within the Rails framework, and I wanted to utilize the helpers/paths. [@full_quote_ho_model, @full_quote_ho] didn''t work and caused similar issues. As I said earlier, if the IDs for the parent model and it''s nested models are the same, everything works fine - but if not, that''s when there is an error. So, I have a feeling it isn''t my view code/URLs, but rather the logic behind how I have things routed and/or designed. -- Posted via http://www.ruby-forum.com/.