【问题标题】:How to do a non-model form in ruby on rails?如何在 ruby​​ on rails 中做一个非模型形式?
【发布时间】:2009-12-15 22:38:39
【问题描述】:

我正在尝试在 ruby​​ on rails 中制作一个非模型表单,我能找到的大多数示例只有一个字段(比如搜索字段)或使用类似 An Email Form with Ruby on Rails 的旧方式编写表单

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

非常感谢。

【问题讨论】:

标签: ruby-on-rails forms


【解决方案1】:

您将需要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}

【讨论】:

    【解决方案2】:

    如果您创建一个类来表示您的对象(我们称之为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 或其他自定义表单构建器,您可以使用此对象,轻松保留现有表单样式。

    【讨论】:

      【解决方案3】:

      从 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
      

      【讨论】:

      • 同样适用于 Rails5
      【解决方案4】:

      您可以将 ActionView::Helpers::FormTagHelper 用于非模型用途。喜欢

      form_tag
      text_field_tag
      hidden_field_tag
      

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

      【讨论】:

        【解决方案5】:

        【讨论】:

        • 谢谢,但这看起来很硬核,我只是一个初学者,如果我成为一名 Rails 忍者,我可能会尝试。
        • Presenter 实际上是一种非常好的模式,可以用来表示不直接绑定到模型的表单,即使对于初学者也是如此。
        猜你喜欢
        • 1970-01-01
        • 2013-06-12
        • 1970-01-01
        • 2020-06-03
        • 2020-04-23
        • 1970-01-01
        • 1970-01-01
        • 2012-09-20
        • 2015-09-19
        相关资源
        最近更新 更多