【问题标题】:SimpleForm without for (non model form)不带 for 的 SimpleForm(非模型形式)
【发布时间】:2011-07-08 01:23:57
【问题描述】:

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

https://github.com/plataformatec/simple_form

【问题讨论】:

标签: ruby-on-rails ruby-on-rails-3 simple-form


【解决方案1】:

您可以使用: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>

【讨论】:

  • @toxaq 也许这不是一个很好的例子。您可以使用f.input :name, :as =&gt; :string 并生成带有标签、提示等的常用表单。
  • 奇怪的是,这正是我想要做的,但没有成功。你的例子至少给了我一个undefined method 'name?' for nil:NilClass
  • 这个选项在幕后仍然使用模型。该符号应与模型名称匹配,它将解析为模型并创建一个新模型并在每个字段上使用它,因此表单字段中使用的属性应该实际存在于模型中。
  • 我不明白为什么这是公认的答案,因为答案是错误的。
  • 是的,我想我之前错过了这一点,我写了一个更好的答案为comment。我已经更新了答案,所以它做了 simple_form 应该做的事情。
【解决方案2】:

不幸的是 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_form 依赖于使用模型" 谢谢这正是我想要的:)
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

    您也可以传递: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的类型

    【讨论】:

    • 这个选项仍然使用隐藏的模型。该符号应与模型名称匹配,它将解析为模型并创建一个新模型并在每个字段上使用它,因此表单字段中使用的属性应该实际存在于模型中。
    【解决方案5】:

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

    为了模仿 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}" }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-09
      • 1970-01-01
      相关资源
      最近更新 更多