2009-08-13 8 views
11

Tôi là một phần của người mới sử dụng Rails. Tôi đang viết một ứng dụng đường ray-couch, vì vậy tôi không sử dụng activerecord cho mẫu này. Tôi đã chỉ ra rằng điều đó có nghĩa làSoạn thảo biểu mẫu form_tag Rails - với mẫu bản ghi không hoạt động

form_for(@model) 

sẽ không hoạt động. Tôi đang cố gắng tìm cách sử dụng form_tag - nhưng hầu hết các ví dụ không liên quan đến việc tạo các hành động mới &.

này là sai:

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

Bởi vì khi tôi chạy kịch bản dưa chuột của tôi, tôi có được điều này:

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

Nhưng tôi không hiểu sai, hoặc làm thế nào để sửa chữa nó.

Trả lời

16

Phương thức form_tag không sử dụng trình tạo biểu mẫu, do đó bạn không thể sử dụng biến "f" trong khối biểu mẫu. Thay vì f.error_messages bạn phải sử dụng error_messages_for vv

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

Điều đó nói rằng, bạn có thể sử dụng form_for với các đối tượng không ActiveRecord, họ chỉ cần để đáp ứng với các phương pháp nhất định. Đảm bảo rằng các phương pháp này được thực hiện trong mô hình Điều.

  • id
  • new_record?
  • to_param
  • errors

Đó chỉ là một phỏng đoán về những gì là cần thiết, có thể có những người khác. Nếu chúng được thực hiện và hoạt động như ActiveRecord thì bạn có thể sử dụng form_for.

+0

Cảm ơn Ryan. Nếu tôi quyết định thêm hỗ trợ cho form_for vào mô hình của tôi - mọi đề xuất về cách xác nhận toàn bộ các phương thức cần thiết? –

+0

Tôi không biết cách nào trong Rails 2 để xác định tập hợp "đầy đủ" các phương thức cần thiết. Nếu bạn làm một số xét nghiệm và không nhận được lỗi method_missing nó có lẽ là tốt. Rails 3 sẽ giới thiệu một cách được làm tài liệu để làm điều này và cung cấp một giao diện được thiết lập để bạn có thể xác định trong mô hình. – ryanb

+0

Ok - bây giờ tôi quá lame để tìm ra cách truy cập các giá trị biểu mẫu! Trong bộ điều khiển của tôi, tôi có: def create @article = Article.new (: title => params [: article]) Nhưng điều đó không hiệu quả. Tôi nhận được những điều sau đây khi tôi cố gắng sử dụng nó trong nội bộ để khởi tạo lớp: Và tôi nhấn "Tạo" # features/step_definitions/webrat_steps.rb: 14 phương thức undefined 'downcase 'cho {" title "=>" Spuds " }: HashWithIndifferentAccess (NoMethodError) Bất kỳ đầu mối nào? –