【发布时间】:2011-07-08 01:23:57
【问题描述】:
是否可以在没有模型的情况下使用 Simple Form(作者:Plataformatec)?
【问题讨论】:
-
也许[我对另一个问题的回答][1] 对您有所帮助。 [1]:stackoverflow.com/a/14659270/157816
标签: ruby-on-rails ruby-on-rails-3 simple-form
是否可以在没有模型的情况下使用 Simple Form(作者:Plataformatec)?
【问题讨论】:
标签: ruby-on-rails ruby-on-rails-3 simple-form
您可以使用:symbol 作为第一个参数。
<%= simple_form_for :user, url: users_path do |f| %>
<%= f.input :name, as: :string %>
...
<% end %>
它会输出如下内容:
<form novalidate="novalidate" class="simple_form user" action="/users" accept-charset="UTF-8" method="post">
...
<div class="input string required user_name">
<label class="string required" for="user_name">
<abbr title="required">*</abbr> Name
</label>
<input class="string required" type="text" name="user[name]" id="user_name" />
</div>
...
</form>
【讨论】:
f.input :name, :as => :string 并生成带有标签、提示等的常用表单。
undefined method 'name?' for nil:NilClass。
不幸的是 simple_form 依赖于使用模型。从本质上讲,如果有类似 simple_form_tag 和 input_tag 方法等价于它们的 rails *_tag 帮助器,那就太好了。在那之前,有一个简单的解决方法。
在表单中使用符号代替类并显式传递值以防止 simple_form 尝试访问模型属性。
<%= simple_form_for :user, :url => '/users' do |f| %>
<%= f.text_field :name, input_html: { value: nil } %>
<% end %>
这将避免undefined method 'name' for User 错误。
【讨论】:
selected 而不是value 以避免undefined method 'name' for Model 错误
您还可以在表单模型中使用模型之外的字段,使用 simple_fields_for,如下所示:
<%= simple_form_for @user do |f| %>
<%= f.input :name %>
<%= simple_fields_for :no_model_fields do |n| %>
<%= n.input :other_field %>
<% end %>
<% end %>
这是一个简单实用的解决方案,因为您可以从不同的模型或不使用模型创建不同类型的字段
【讨论】:
您也可以传递:symbol 而不是@object 作为simple_form_for 的参数。
<%= simple_form_for :email, :url => '/post_email' do |f| %>
<%= f.input :subject, :as => :string %>
<% end %>
哪个会输出:
<form method="post" class="simple_form email" action="/post_email" accept-charset="UTF-8">
...
<input type="text" size="30" name="email[subject]" id="email_subject">
</form>
请注意以下缺点:
:url和每个input的类型
【讨论】:
上面的所有方法仍然会为您留下嵌套在“用户”或您作为第一个参数传递的任何符号内的表单数据。这很烦人。
为了模仿 simple_form 的风格/优点,但删除对象/符号依赖和强制数据嵌套,您可以创建一个部分。
HAML 例子:
表单视图:
= form_tag("path/to/action", method: "POST") do
= render "path/to/partial/field", type: "string", required: true, item: "first_name"
field部分:
- required_string = required ? "required" : ""
%div{class: "input #{type} #{required_string} #{item}"}
%label{class: "#{type} #{required_string}", for: "#{item}"}
- if required
%abbr{title: "required"}
*
= t("application.#{item}")
%input{name: "#{item}", |
placeholder: t("application.#{item}"), |
type: "#{type}", |
required: required, |
"aria-required" => "#{required}" }
【讨论】: