83

是否可以在没有模型的情况下使用 Simple Form(by:Plataformatec)?

https://github.com/plataformatec/simple_form

4

5 回答 5

126

您可以: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>
于 2011-03-03T13:56:12.307 回答
19

不幸的是 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错误。

于 2013-07-02T19:38:59.410 回答
15

您还可以在表单模型中使用模型外部的字段,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 %>

这是一个简单实用的解决方案,因为您可以从不同的模型或不使用模型创建不同类型的字段

于 2016-08-05T16:02:41.197 回答
4

您也可以传递 a: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
于 2013-03-06T23:59:56.760 回答
4

上述所有方法仍然为您留下嵌套在“用户”或您作为第一个参数传递的任何符号内的表单数据。这很烦人。

为了模仿 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}" }
于 2014-11-17T17:44:21.973 回答