如何在轨道上的红宝石中做一个非模型表格?

时间:2009-12-15 22:38:40

标签: ruby-on-rails forms

我正在尝试在轨道上的ruby中创建一个非模型表单,我可以找到的大多数示例只有一个字段(例如搜索字段)或使用旧的方式编写这样的表单{{3 }}

如果有人可以向我展示一个非模型表单的示例代码,其中有两个字段用于视图以及我如何访问控制器中的那些字段,我将不胜感激。

非常感谢。

5 个答案:

答案 0 :(得分:32)

您需要FormHelper种方法:

假设您想要一个提交test操作的简单do_test操作:

测试操作的简单视图(posts / 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 -%>

在帖子控制器中:

def test
end

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

此外,您还需要将这两个操作添加到config / routes.rb

中的路由
map.resources :posts, :collection=>{:test => :get, :do_test => :post}

答案 1 :(得分:6)

如果创建一个表示对象的类(我们称之为ContactInfo),您可以在该类上定义方法,然后使用标准的Rails表单构建器助手来使用它们。

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

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

以你的形式:

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

到目前为止,谁在乎呢?

然而,添加validatable gem,你有一个真正的原因来做到这一点!现在,您可以像真实模型一样获得验证消息。

查看我完成的ContactInfo类:

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

我喜欢这个,因为你可以像调用ActiveRecord对象一样编写你的控制器,而不需要在需要重新显示表单时用很多逻辑来编写它。

另外,如果您使用的是Formtastic或其他自定义表单构建器,则可以使用此对象,轻松保留现有的表单样式。

答案 2 :(得分:4)

从Rails 4开始,您可以使用ActiveModel :: Model

http://blog.isnorcreative.com/2014/05/08/easier-non-activerecord-models-in-rails-4.html

class Contact
  include ActiveModel::Model

  attr_accessor :email, :message
  validates :email, presence: true, length: {in:2..255}

end

答案 3 :(得分:1)

您可以使用ActionView :: Helpers :: FormTagHelper进行非模型使用。像

form_tag
text_field_tag
hidden_field_tag

Api有很多很好的例子。 http://api.rubyonrails.org/classes/ActionView/Helpers/FormTagHelper.html

答案 4 :(得分:0)