Di Zou wrote in post #1023800:
> I am using Rails 2.3.8. I have a view with a list of mobile carriers. I
> want to assign a country to each mobile carrier. I do this by having a
> drop down list with available countries for the user to select.
Hum, where to begin?
> This is my form:
>
> <table>
> <tbody>
> <% form_for :HhActiveCarrier, @carriers, :url => { :action => "update"
The "form_for" helper used with a collection doesn't make any sense.
Take a look at the examples in the Rails docs. Do you see any mention of
using form_for with a collection of model instances?
Example:
<%= form_for @offer do |f| %>
> } do |f| %>
> <% for carrier in @carriers %>
> <tr>
> <%= render :partial => "summary_detail", :locals => {:carrier =>
> carrier, :f => f} %>
> </tr>
> <% end %>
> </tbody>
> </table>
> <%= submit_tag "Update" %>
> <% end %>
>
> With my partial:
> <td class="tn"><%= h(carrier.name.to_s()) -%></td>
> <td class="sc"><%= h(carrier.country.to_s()) -%></td>
> <td class="sc"><%= select(:carrier, "country", @countries) -%></td>
>
> This is the controller where I define the variables:
>
> class ActiveCarriersController < ApplicationController
>
> def index
> @carriers = HhActiveCarrier.find(:all)
> for carrier in @carriers
> country = carrier["country"]
> if country.nil?
> carrier["country"] = "none"
> end
> end
> @countries = ["USA", "UK", "Canada"]
> end
First of all, this is too much logic for a Rails controller action
method. You should consider moving some of this logic into the model
class.
Second. In a typical Rails application the index action is accessed via
a GET request, which should be consider "safe." See the link below for
an explanation the meaning of "Safe Methods."
http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html
> def update
> carrier = HhActiveCarrier.find(params[:name])
>
> redirect_to( :action => "index" )
> end
The redirect used here is going to lose all context, which means the
"find" that assigns the local variable "carrier" is useless. Even if the
context was not reset by the redirection, the scope of "carrier" is
local to the update method, which means you are attempting to find
something and then doing nothing with the result.
> When I click the "Update" button, I want to have the "country" of each
> HHActiveCarrier to be set. Right now this is the error I get:
>
> Couldn't find HhActiveCarrier without an ID
Specifically, this error is because "form_for" is intended to be used
with an instance of a model object not a collection of model objects,
and the update action in a Rails controller is intended to update the
one model instance that is reference in the URL.
Also, you are using the find method, which expects an id for finding the
carrier referenced in the URL. If you were attempting to find a carrier
(or carriers) by a name column then take a look at the dynamic finders
provided by Rails. Such as "find_by_name(params[:name])" However, this
is not going to help you in this scenario.
PUT: http://example.com/hh_active_carrier/1
where the "1" is the ID of the carrier to be updated.
> How do I solve this problem? Thanks.
There's too much to explain for me to even attempt to tell you how to
fix this. My recommendation is to go back and study the Rails guides on
how to use the various action methods and form helpers in a Rails
application.
http://guides.rubyonrails.org/index.html
--
Posted via http://www.ruby-forum.com/.
--
You received this message because you are subscribed to the Google Groups "Ruby
on Rails: Talk" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/rubyonrails-talk?hl=en.