2009-12-15 32 views
18

Tôi đang cố tạo một dạng không phải là mẫu trên ruby ​​trên đường ray, hầu hết các ví dụ tôi có thể tìm thấy chỉ có một trường (ví dụ: trường tìm kiếm) hoặc sử dụng cách viết cũ như sau: An Email Form with Ruby on RailsLàm thế nào để làm một hình thức phi mô hình trong ruby ​​trên đường ray?

Nếu bất cứ ai có thể hiển thị cho tôi mã ví dụ về biểu mẫu không có mô hình với hai trường cho chế độ xem và cách tôi truy cập các trường đó trong trình điều khiển, tôi sẽ biết ơn.

Cảm ơn rất nhiều.

+0

Tôi cũng nhận thấy một vài ý kiến ​​khắp nơi trên web ngụ ý rằng các hình thức phi mô hình là một nỗi đau để xác nhận, sinh mệnh trường hợp nó sẽ dễ dàng hơn để sử dụng một "hình thức cho" phong cách cho một hình thức liên lạc? – conspirisi

+0

Kiểm tra đá quý hợp lệ để dễ dàng xác thực các đối tượng không phải là cơ sở dữ liệu. http://github.com/jnunemaker/validatable –

+0

Để khôi phục các giá trị đầu vào khi xác thực không thành công: http://stackoverflow.com/questions/4129229/rails-restoring-contents-of-non-model-form-that-uses- form-tag/24974457 # 24974457 –

Trả lời

32

Bạn sẽ cần FormHelper phương pháp:

Giả sử bạn muốn có một test hành động đơn giản mà nộp để do_test hành động:

Một cái nhìn đơn giản cho hành động kiểm tra (bài viết/test.html.erb):

<% form_tag '/posts/do_test' do %> 
    <%=label_tag 'name' %> 
    <%=text_field_tag 'name'%> 

    <%=label_tag 'phone' %> 
    <%=text_field_tag 'phone'%> 

    <div><%= submit_tag 'Save' %></div> 
<% end -%> 

Trong bộ điều khiển bài viết:

def test 
end 

def do_test 
    name = params[:name] 
    phone = params[:phone] 
    # do whatever you want... 
end 

Ngoài ra, bạn cần phải thêm những 2 hành động để các tuyến đường trong config/routes.rb

map.resources :posts, :collection=>{:test => :get, :do_test => :post} 
+0

có vẻ tốt, tôi sẽ thử điều này ... – conspirisi

0

Bạn có nghĩ đến việc sử dụng trình bày không?

http://blog.jayfields.com/2007/03/rails-presenter-pattern.html

+0

cảm ơn, nhưng trông có vẻ khó tin, tôi chỉ là người mới bắt đầu, tôi có thể thử rằng nếu tôi trở thành một ninja đường ray. – conspirisi

+0

Một người trình bày thực sự là một mô hình rất tốt để làm theo để đại diện cho các hình thức không trực tiếp ràng buộc với một mô hình, ngay cả đối với người mới bắt đầu. – yagooar

5

Nếu bạn tạo một lớp học để đại diện cho đối tượng của bạn (Hãy gọi nó là ContactInfo), bạn có thể xác định phương pháp trên lớp, sau đó sử dụng chúng bằng cách sử dụng trình trợ giúp trình tạo biểu mẫu Rails chuẩn.

class ContactInfo 
    attr_accessor :name, :company, :email, :phone, :comments 

    def initialize(hsh = {}) 
    hsh.each do |key, value| 
     self.send(:"#{key}=", value) 
    end 
    end 
end 

Và trong hình của bạn:

<h2>Contact Us</h2> 
<% form_for(@contact_info, :url => path_for_your_controller_that_handles_this, :html => {:method => :post}) do |f| %> 

    <%= f.label :name %> 
    <%= f.text_field :name %> 

    ... 
<% end %> 

Cho đến nay, những người quan tâm phải không?

Tuy nhiên, hãy thêm vào số validatable gem và bạn có lý do thực sự để thực hiện việc này! Bây giờ bạn có thể có các thông báo xác thực giống như một mô hình thực.

Check-out hoàn thành lớp ContactInfo tôi:

class ContactInfo 
    include Validatable 

    attr_accessor :name, :company, :email, :phone, :comments 

    validates_presence_of :name 
    validates_presence_of :email 
    validates_presence_of :phone 

    def initialize(hsh = {}) 
    hsh.each do |key, value| 
     self.send(:"#{key}=", value) 
    end 
    end 
end 

Tôi thích video này bởi vì bạn có thể viết điều khiển nhiều theo cùng một cách bạn như là một đối tượng ActiveRecord và không phải Muss nó lên với rất nhiều của logic cho khi bạn cần để hiển thị lại biểu mẫu.

Ngoài ra, nếu bạn đang sử dụng Formtastic hoặc trình tạo biểu mẫu tùy chỉnh khác, bạn có thể sử dụng đối tượng này với nó, dễ dàng giữ kiểu dáng hiện có của bạn.

+0

cảm ơn, tôi sẽ kiểm tra điều này, đôi khi sớm ... – conspirisi

Các vấn đề liên quan