2009-08-13 13 views
11

Sono un po 'un principiante di Rails. Sto scrivendo un'app couchrest-rails, quindi non sto usando activerecord per questo modello. Ho appena capito che ciò significa cheRails form_tag scrittura modulo - con modello di record non attivo

form_for(@model) 

non funziona. Sto cercando di capire come usare form_tag - ma la maggior parte degli esempi non coinvolge nuove azioni & create.

Questo è sbagliato:

<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 %> 

Perché quando eseguo il mio scenario di cetriolo, ottengo questo:

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"' 

Ma io non capisco l'errore, o il modo di risolvere il problema.

risposta

16

Il metodo form_tag non utilizza un generatore di moduli, quindi non è possibile utilizzare la variabile "f" nel blocco modulo. Invece di f.error_messages devi usare error_messages_for, ecc

<% 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 %> 

Detto questo, è possibile utilizzare form_for con oggetti non ActiveRecord, hanno solo bisogno di rispondere a certi metodi. Assicurarsi che questi metodi siano implementati nel modello Articolo.

  • id
  • new_record?
  • to_param
  • errors

Questo è solo una supposizione su ciò che è necessario, ci possono essere altri. Se questi sono implementati e si comportano come ActiveRecord dovresti essere in grado di usare form_for.

+0

Grazie Ryan. Se decido di aggiungere il supporto per form_for ai miei modelli - qualche suggerimento su come confermare il set completo di metodi necessari? –

+0

Non conosco un modo in Rails 2 per determinare il set "completo" di metodi necessari. Se fai qualche test e non ottieni errori method_missing probabilmente è buono. Rails 3 introdurrà un modo documentato per fare ciò e offrirà un'interfaccia stabilita che potrai definire nel modello. – ryanb

+0

Ok - ora sono troppo zoppo per capire come accedere ai valori del modulo! Nel mio controller ho: def creare @article = Article.new (: title => params [: article]) Ma questo non funziona. Ottengo il seguente quando provo ad usarlo internamente per inizializzare la classe: E premo "Crea" # features/step_definitions/webrat_steps.rb: 14 metodo non definito 'downcase 'per {" title "=>" Spuds " }: HashWithIndifferentAccess (NoMethodError) Qualsiasi indizio? –

Problemi correlati