Please help; form_for passes nil

I have an update button that doesn’t update. Watching the server
during the attempt, I see:

Processing OrvesController#update (for 128.119.60.171 at 2010-04-02
13:13:29) [PUT]
Parameters: {“orf”=>nil, “commit”=>“Update”, “id”=>“19544”}

orf is my model I’m trying to update in the database. Why is it nil?

The view for the page with the update button is called edit.html.erb
and contains:

Editing orf

<% form_for @orf do |f| %> <% end %>

orf’s attributes locus_tag and current_annotation are being correctly
displayed.

Here’s the update method:

def update
@orf = Orf.find(params[:id])
if @orf.update_attributes(params[:orf])
flash[:notice] = ‘Orf was successfully updated.’
redirect_to orf_path
else
flash[:notice] = ‘Update failed.’
redirect_to orf_path
end
end

routes.rb contains the line:
map.resources :orves

No error message appears in the web browser. The update just doesn’t
change anything.

I’m running Rails 2.3.0.

Any idea what I’m doing wrong?

<%= f.error_messages %> <%= h @orf.locus_tag %> <%= f.text_field 'current_annotation', :size => 50 %> <%= f.submit "Update" %> <%= button_to "Undo last change", :action => :undo_last_change, :id => @orf %>

On Apr 2, 6:23 pm, dirtbug [email protected] wrote:

I have an update button that doesn’t update. Watching the server
during the attempt, I see:

Processing OrvesController#update (for 128.119.60.171 at 2010-04-02
13:13:29) [PUT]
Parameters: {“orf”=>nil, “commit”=>“Update”, “id”=>“19544”}

orf is my model I’m trying to update in the database. Why is it nil?

It’s probably worth taking a look at the raw data posted by the
browser - if it is malformed in some way that could be causing rails
to parse it in a funny way. It probably doesn’t help that your html is
malformed (a td must be contained in a tr or similar, i’m pretty sure
you can’t stick a form in a table like that and the button_to will
create a second form (ie you’ll have a form nested in another form)

Fred

On 2 April 2010 21:56, Frederick C. [email protected]
wrote:

orf is my model I’m trying to update in the database. Why is it nil?

It’s probably worth taking a look at the raw data posted by the
browser - if it is malformed in some way that could be causing rails
to parse it in a funny way. It probably doesn’t help that your html is
malformed (a td must be contained in a tr or similar, i’m pretty sure
you can’t stick a form in a table like that and the button_to will
create a second form (ie you’ll have a form nested in another form)

Fred

As Fred has pointed out your html is invalid. I find the html
validator add-in for firefox excellent as it checks my html as I
develop the app, making sure I do not make such errors. Also you can
paste your html into the w3c htlm validator (find with google if
necessary) to check it.

It is a pain that forms cannot be wrapped around table cells but that
is the way it is, some browsers will cope with it but it cannot be
guaranteed. A form can only wrap a whole table or fit entirely within
a cell.

Colin

Thanks for the reply. I’ve now fixed the html (removed the table), but
it didn’t fix the problem. The edit view is:

Editing orf

<% form_for @orf do |f| %> <%= f.error_messages %> <%= h @orf.locus_tag %> <%= f.text_field 'current_annotation', :size => 50 %> <%= f.submit "Update" %> <%= button_to "Undo last change", :action => :undo_last_change, :id => @orf %> <% end %>

I’m not sure what you mean about taking a look at the raw data posted
by the browser to see if it is malformed. I turned on Firebug and
looked at what it was trying to do when I pressed my “Update” button
and I don’t see anything wrong. It shows:

_method put
commit Update
orf[current_annotation] hypothetical proteinski

That looks OK to me , but I don’t really know what I should be looking
for. I was trying to change the current_annotation from hypothetical
protein to hypothetical proteinski, so it looks like it tried. But
the change doesn’t happen. Any suggestion of how to troubleshoot this
further?

On Apr 2, 4:56 pm, Frederick C. [email protected]

On 5 April 2010 21:46, dirtbug [email protected] wrote:

<% end %>

I’m not sure what you mean about taking a look at the raw data posted
by the browser to see if it is malformed. I turned on Firebug and
looked at what it was trying to do when I pressed my “Update” button
and I don’t see anything wrong. It shows:

Try the html validator addon for firefox as I suggested, or/and the
w3c html validator (google will find it). Then you know your html is
valid.

Then have a look at the debugging guide at
http://guides.rubyonrails.org/ which will show how to break into your
code using ruby-debug (and other debugging techniques) to find out
what is going wrong. Also have a look at the params in the log and
convince yourself the data are there as expected.

Colin

Colin

On Apr 5, 9:46 pm, dirtbug [email protected] wrote:

Thanks for the reply. I’ve now fixed the html (removed the table), but
it didn’t fix the problem. The edit view is:

You’ve still got a form nested inside a form (button_to creates a
form)

Fred

dirtbug wrote:

I have an update button that doesn’t update. Watching the server
during the attempt, I see:

Processing OrvesController#update (for 128.119.60.171 at 2010-04-02
13:13:29) [PUT]
Parameters: {“orf”=>nil, “commit”=>“Update”, “id”=>“19544”}

orf is my model I’m trying to update in the database. Why is it nil?

The view for the page with the update button is called edit.html.erb
and contains:

Editing orf

<% form_for @orf do |f| %> <% end %>

try this -

<% form_for :table, @var,:url=>{:action=>:action}, :html => {:name =>
‘form’} do |f| %>

<%= f.error_messages %> <%= h @orf.locus_tag %> <%= f.text_field 'current_annotation', :size => 50 %> <%= f.submit "Update" %> <%= button_to "Undo last change", :action => :undo_last_change, :id => @orf %>

On 6 April 2010 15:25, dirtbug [email protected] wrote:

<% end %>

Still doesn’t update.

Can you confirm that the html now validates successfully? If so then
please post the html for the form and what is seen in the log when the
button is clicked.

Colin

Fred

Thanks. I took out the whole button_to line, but it still doesn’t
work. I now have:

Editing orf

<% form_for @orf do |f| %> <%= f.error_messages %> <%= h @orf.locus_tag %> <%= f.text_field 'current_annotation', :size => 50 %> <%= f.submit "Update" %> <% end %>

Still doesn’t update.

On Apr 5, 6:12 pm, Frederick C. [email protected]

Colin,

I don’t know how to determine if validation is happening or whether it
is successful.

The edit.html.erb is:

Editing orf

<% form_for @orf do |f| %> <%= f.error_messages %> <%= h @orf.locus_tag %> <%= f.text_field 'current_annotation', :size => 50 %> <%= f.submit "Update" %> <% end %>

the update method is:

def update
@orf = Orf.find(params[:id])
if @orf.update_attributes(params[:orf])
#if @orf.update_attribute(:current_annotation,
@orf[ “current_annotation” ])
flash[:notice] = ‘Orf was successfully updated.’
redirect_to orf_path
else
flash[:notice] = ‘Update failed.’
redirect_to orf_path
end
end

and the log (upon clicking the button shows:

Processing OrvesController#update (for 128.119.60.171 at 2010-04-06
11:52:39) [PUT]
Parameters: {“orf”=>nil, “commit”=>“Update”, “id”=>“1705”}
Orf Columns (26.0ms) SHOW FIELDS FROM orves
Orf Load (1.1ms) SELECT * FROM orves WHERE (orves.id =
1705)
SQL (0.2ms) BEGIN
SQL (0.2ms) COMMIT
Redirected to /orves/1705
Completed in 52ms (DB: 28) | 302 Found [http://
andromeda.micro.umass.edu/orves/1705]
SQL (0.4ms) SET NAMES ‘utf8’
SQL (0.2ms) SET SQL_AUTO_IS_NULL=0

Processing OrvesController#show (for 128.119.60.171 at 2010-04-06
11:52:39) [GET]
Parameters: {“id”=>“1705”}
Orf Columns (17.7ms) SHOW FIELDS FROM orves
Orf Load (1.1ms) SELECT * FROM orves WHERE (orves.id =
1705)
Rendering orves/show
Completed in 83ms (View: 45, DB: 19) | 200 OK [http://
andromeda.micro.umass.edu/orves/1705]

By the way, I commented out the line in application_controller.rb that
had:
#protect_from_forgery # See
ActionController::RequestForgeryProtection for details

Thanks.

On 6 April 2010 16:51, dirtbug [email protected] wrote:

Colin,

I don’t know how to determine if validation is happening or whether it
is successful.

I have told you twice previously. Install the html tidy plugin in
firefox, and/or paste the whole html of the page (View, Page Source in
browser, or similar and copy the text) into the w3c html validator
(google w3c html validator to find it).

You have not shown us the html of the form (View Page Source again to
see it) that I asked for.

Colin

On 6 April 2010 17:12, Colin L. [email protected] wrote:

On 6 April 2010 16:51, dirtbug [email protected] wrote:

Colin,

I don’t know how to determine if validation is happening or whether it
is successful.

I have told you twice previously. Install the html tidy plugin in
firefox, and/or paste the whole html of the page (View, Page Source in
browser, or similar and copy the text) into the w3c html validator
(google w3c html validator to find it).

Sorry, that is the Html Validator plugin for FF

Colin

Colin,

Here is the html of the form, before I press the update button:

Editing orf

Gura_0317

When I paste it into the html validator (on their web page), I get:

Validation Output: 2 Errors

  1. Error Line 1, Column 1: no document type declaration; will parse
    without validation

    Editing orf

    ✉

    The document type could not be determined, because the document
    had no correct DOCTYPE declaration. The document does not look like
    HTML, therefore automatic fallback could not be performed, and the
    document was only checked against basic markup syntax.

    Learn how to add a doctype to your document from our FAQ, or use
    the validator’s Document Type option to validate your document against
    a specific Document Type.

  2. Error Line 2, Column 77: document type does not allow element
    “FORM” here

    …_orf" id=“edit_orf_1705” method=“post”>

    <input …

    ✉

    The element named above was found in a context where it is not
    allowed. This could mean that you have incorrectly nested elements –
    such as a “style” element in the “body” section instead of inside
    “head” – or two elements that overlap (which is not allowed).

    One common cause for this error is the use of XHTML syntax in
    HTML documents. Due to HTML’s rules of implicitly closed elements,
    this error can create cascading effects. For instance, using XHTML’s
    “self-closing” tags for “meta” and “link” in the “head” section of a
    HTML document may cause the parser to infer the end of the “head”
    section and the beginning of the “body” section (where “link” and
    “meta” are not allowed; hence the reported error).

  3. Warning Line 2, Column 158: NET-enabling start-tag requires
    SHORTTAG YES

    …e=“margin:0;padding:0”>

✉

The sequence can be interpreted in at least two
different ways, depending on the DOCTYPE of the document. For HTML
4.01 Strict, the ‘/’ terminates the tag <FOO (with an implied ‘>’).
However, since many browsers don’t interpret it this way, even in the
presence of an HTML 4.01 Strict DOCTYPE, it is best to avoid it
completely in pure HTML documents and reserve its use solely for those
written in XHTML.

  • Warning Line 5, Column 120: NET-enabling start-tag requires
    SHORTTAG YES

    …orf[current_annotation]" size=“50” type=“text”
    value=“hypothetical protein” />

    ✉

    The sequence can be interpreted in at least two
    different ways, depending on the DOCTYPE of the document. For HTML
    4.01 Strict, the ‘/’ terminates the tag <FOO (with an implied ‘>’).
    However, since many browsers don’t interpret it this way, even in the
    presence of an HTML 4.01 Strict DOCTYPE, it is best to avoid it
    completely in pure HTML documents and reserve its use solely for those
    written in XHTML.

  • Warning Line 6, Column 68: NET-enabling start-tag requires
    SHORTTAG YES

    ✉

    The sequence can be interpreted in at least two
    different ways, depending on the DOCTYPE of the document. For HTML
    4.01 Strict, the ‘/’ terminates the tag <FOO (with an implied ‘>’).
    However, since many browsers don’t interpret it this way, even in the
    presence of an HTML 4.01 Strict DOCTYPE, it is best to avoid it
    completely in pure HTML documents and reserve its use solely for those
    written in XHTML.

  • On 6 April 2010 19:26, dirtbug [email protected] wrote:

    Colin,

    I added a layout file that had gone missing and now it validates. The
    html;

    Well, that was a worthwhile exercise, even if it was not the cause of
    the problem.

    Gura_0317 And the validation report:

    HTML Validator
    0 errors, 0 warnings

    The validated page has no errors, no warning found by the SGML Parser
    and HTML Tidy.

    But it still doesn’t update the database.

    The other thing I asked a few mails ago was what is shown in the log
    when you click submit, now that you have corrected several problems.

    Colin

    Colin,

    I added a layout file that had gone missing and now it validates. The
    html;

    Orves: edit

    Editing orf

    Gura_0317

    And the validation report:

    HTML Validator
    0 errors, 0 warnings

    The validated page has no errors, no warning found by the SGML Parser
    and HTML Tidy.

    But it still doesn’t update the database.

    Colin,

    The log now shows:

    Processing OrvesController#update (for 128.119.60.171 at 2010-04-06
    14:48:28) [PUT]
    Parameters: {“orf”=>nil, “commit”=>“Update”, “id”=>“1705”}
    [4;36;1mOrf Columns (22.6ms) [0m [0;1mSHOW FIELDS FROM
    orves [0m
    [4;35;1mOrf Load (0.9ms) [0m [0mSELECT * FROM orves WHERE
    (orves.id = 1705) [0m
    [4;36;1mSQL (0.2ms) [0m [0;1mBEGIN [0m
    [4;35;1mSQL (0.3ms) [0m [0mCOMMIT [0m
    Redirected to /orves/1705
    Completed in 49ms (DB: 25) | 302 Found [http://
    andromeda.micro.umass.edu/orves/1705]
    [4;36;1mSQL (0.4ms) [0m [0;1mSET NAMES ‘utf8’ [0m
    [4;35;1mSQL (0.3ms) [0m [0mSET SQL_AUTO_IS_NULL=0 [0m

    Processing OrvesController#show (for 128.119.60.171 at 2010-04-06
    14:48:28) [GET]
    Parameters: {“id”=>“1705”}
    [4;36;1mOrf Columns (18.5ms) [0m [0;1mSHOW FIELDS FROM
    orves [0m
    [4;35;1mOrf Load (0.9ms) [0m [0mSELECT * FROM orves WHERE
    (orves.id = 1705) [0m
    Rendering template within layouts/orves
    Rendering orves/show
    Completed in 96ms (View: 58, DB: 20) | 200 OK [http://
    andromeda.micro.umass.edu/orves/1705]

    On 6 April 2010 20:30, dirtbug [email protected] wrote:

    Colin,

    The log now shows:

    Processing OrvesController#update (for 128.119.60.171 at 2010-04-06
    14:48:28) [PUT]
    Parameters: {“orf”=>nil, “commit”=>“Update”, “id”=>“1705”}

    Well, amazing, after fixing multiple problems the fundamental issue
    remains unaffected! Can anyone else see why the orf parameter is nil?

    I have always used
    <%= f.text_field :field_name …
    whereas I see you have
    <%= f.text_field ‘field_name’
    but I would be surprised if this were the problem. The html looks ok.

    Does it work when creating a new orf record?

    Colin

    On Apr 6, 8:30 pm, dirtbug [email protected] wrote:

    Colin,

    The log now shows:

    Processing OrvesController#update (for 128.119.60.171 at 2010-04-06
    14:48:28) [PUT]

    Have you had a look (with tcpdump, Firebug etc. ) at exactly what your
    form sends to the server?

    Fred

    Fred,

    Is this what you meant? With Firebug open, I go to the form as a user
    would, change the annotation “hypothetical protein” to “hypothetical
    proteinski”, then click the update button.

    In firebug, I see a new POST request. I can examine it with any of
    four Firebug tabs (Headers, Post, Response, HTML). Using the “post”
    tab, I see:

    _method put
    commit Update
    orf[current_annotation] hypothetical proteinski

    Under the “Request” tab in Firebug, I can examine the Request header,
    which is:

    Host andromeda.micro.umass.edu:8080
    User-Agent Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:
    1.9.1.9) Gecko/20100315 Firefox/3.5.9
    Accept text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8
    Accept-Language en-us,en;q=0.5
    Accept-Encoding gzip,deflate
    Accept-Charset ISO-8859-1,utf-8;q=0.7,*;q=0.7
    Keep-Alive 300
    Connection keep-alive
    Referer http://andromeda.micro.umass.edu:8080/orves/1705/edit
    Cookie []; [];
    __utma=198765611.347868135.1233253686.1269352816.1269440269.55;
    __utmz=198765611.1269352816.54.21.utmccn=(organic)|utmcsr=google|
    utmctr=umass+map|utmcmd=organic;
    ["_baby_session=BAh7BzoPc2Vzc2lvbl9pZCIlMTYxODY1MmVkZDMyOWU3MmJiNjAyM2ZiOTY5NmRmNTNJIgpmbGFzaAY6DWVuY29kaW5nIg1VUy1BU0NJSUlDOidBY3Rpb25Db250cm9sbGVyOjpGbGFzaDo6Rmxhc2hIYXNoewAGOgpAdXNlZHsA–
    ee8a24f1c308ec43a2b838d45cdb58e9a777ed4c; []

    On Apr 6, 5:56 pm, Frederick C. [email protected]

    Colin,

    I don’t have a new method or view, as the db gets populated by a
    script that directly accesses the MySQL db. Thus the db records
    aren’t created by Rails at all, which might be the source of the
    problem I don’t know. The thing is, it all worked fine before we
    upgraded to Rails 2. I’ll try to add a new method and view and try it
    out.