con*_*isi 18 forms ruby-on-rails
我试图在轨道上的ruby中创建一个非模型表单,我可以找到的大多数示例只有一个字段(比如搜索字段)或者使用旧的方式编写这样的表单使用Ruby的电子邮件表单轨道
如果有人能够向我展示一个非模型表单的示例代码,其中有两个字段用于视图以及我如何访问控制器中的那些字段,我将不胜感激.
非常感谢.
khe*_*lll 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 -%>
Run Code Online (Sandbox Code Playgroud)
在帖子控制器:
def test
end
def do_test
name = params[:name]
phone = params[:phone]
# do whatever you want...
end
Run Code Online (Sandbox Code Playgroud)
您还需要将这两个操作添加到config/routes.rb中的路由
map.resources :posts, :collection=>{:test => :get, :do_test => :post}
Run Code Online (Sandbox Code Playgroud)
如果您创建一个类来表示您的对象(让我们调用它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
Run Code Online (Sandbox Code Playgroud)
并以您的形式:
<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 %>
Run Code Online (Sandbox Code Playgroud)
到目前为止,谁在乎呢?
但是,添加有效的宝石,你有一个真正的理由这样做!现在,您可以像真实模型一样获得验证消息.
看看我完成的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
Run Code Online (Sandbox Code Playgroud)
我喜欢这个,因为你可以像调用ActiveRecord对象一样编写你的控制器,而不需要在需要重新显示表单时用很多逻辑来编写它.
另外,如果您使用的是Formtastic或其他自定义表单构建器,则可以使用此对象,轻松保留现有的表单样式.
在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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
17849 次 |
| 最近记录: |