2009-08-13 7 views
11

Ich bin ein bisschen ein Rails-Neuling. Ich schreibe eine Couchstützen-App, verwende also keinen ActiveRecord für dieses Modell. Ich habe gerade herausgefunden, dass dasRails form_tag Formular schreiben - mit nicht-aktiven Rekordmodell

form_for(@model) 

nicht funktioniert. Ich versuche herauszufinden, wie man form_tag benutzt - aber die meisten Beispiele beinhalten keine neuen & create actions.

Das ist falsch:

<h1>New article</h1> 

<% form_tag new_article_url(@article), :method => :post do |f| %> 
    <%= f.error_messages %> 

    <p> 
    <%= f.label :title %><br /> 
    <%= f.text_field :title %> 
    </p> 
    <p> 
    <%= f.submit 'Create' %> 
    </p> 
<% end %> 

<%= link_to 'Back', articles_path %> 

Denn wenn ich meine Gurke Szenario laufen, ich diese bekommen:

Scenario: Create Valid Article       # features/article.feature:16 
    Given I have no articles        # features/step_definitions /article_steps.rb:8 
    And I am on the list of articles      # features/step_definitions/webrat_steps.rb:6 
/home/deploy/www/www.trackingplace.com/app/ccc/app/views/articles/new.html.erb:3: warning: multiple values for a block parameter (0 for 1) 
from /usr/local/lib/ruby/gems/1.8/gems/actionpack-2.3.3/lib/action_view/helpers/capture_helper.rb:36 
When I follow "New Article"        # features/step_definitions/webrat_steps.rb:18 
    You have a nil object when you didn't expect it! 
    The error occurred while evaluating nil.error_messages (ActionView::TemplateError) 
    features/article.feature:19:in `When I follow "New Article"' 

Aber ich verstehe nicht den Fehler, oder wie man es beheben.

Antwort

16

Die form_tag-Methode verwendet keinen Formular-Generator, daher können Sie die Variable "f" nicht im Formularblock verwenden. Statt f.error_messages müssen Sie error_messages_for verwenden usw.

<% form_tag new_article_url(@article), :method => :post do %> 
    <%= error_messages_for :article %> 

    <p> 
    <%= label :article, :title %><br /> 
    <%= text_field :article, :title %> 
    </p> 
    <p> 
    <%= submit_tag 'Create' %> 
    </p> 
<% end %> 

Das heißt, Sie form_for mit nicht Active Objekte verwenden können, sie müssen nur auf bestimmte Methoden reagieren. Stellen Sie sicher, dass diese Methoden im Artikelmodell implementiert sind.

  • id
  • new_record?
  • to_param
  • errors

das ist nur eine Vermutung, was notwendig ist, da andere sein kann. Wenn diese implementiert sind und sich wie ActiveRecord verhalten, sollten Sie form_for verwenden können.

+0

Danke Ryan. Wenn ich mich entscheide, meine Modelle um Unterstützung für form_for zu erweitern - irgendwelche Vorschläge, wie man den kompletten Methodensatz bestätigt? –

+0

Ich kenne keinen Weg in Rails 2, um den "vollständigen" Satz von notwendigen Methoden zu bestimmen. Wenn Sie einige Tests durchführen und method_missing Fehler nicht erhalten, ist es wahrscheinlich gut. Rails 3 wird einen dokumentierten Weg vorstellen, um dies zu tun und bietet eine etablierte Schnittstelle, die Sie im Modell definieren können. – ryanb

+0

Ok - jetzt bin ich zu lahm, um herauszufinden, wie man auf die Formularwerte zugreifen kann! In meiner Steuerung habe ich: def erstellen @article = Article.new (: title => params [: Artikel]) Aber das funktioniert nicht. Ich bekomme Folgendes, wenn ich versuche, es intern zu verwenden, um die Klasse zu initialisieren: Und ich drücke "Create" # features/step_definitions/webrat_steps.rb: 14 undefined Methode 'downcase 'für {" title "=>" Spuds " }: HashWithIndifferentAccess (NoMethodError) Irgendwelche Hinweise? –

Verwandte Themen