不带for的SimpleForm(非模型形式)


Answers:


123

您可以将其: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>

4
@toxaq也许这不是一个好例子。您可以使用f.input :name, :as => :string与标签,提示等,并生成通常的形式
htanata

8
奇怪的是,这正是我想要做的并且没有成功。您的示例undefined method 'name?' for nil:NilClass至少为我提供了一个。
toxaq 2012年

11
此选项仍使用内部模型。该符号应与模型名称匹配,它将解析为模型并创建一个新模型,并在每个字段上使用它,因此在表单字段中使用的属性应实际上存在于模型中。
米格尔·马德罗

17
我不明白为什么这是可接受的答案,因为答案是错误的。
菲利普2014年

1
是的,我想我以前没有讲到这一点,我已经写了一个更好的答案作为评论。我已经更新了答案,因此它可以完成simple_form应该做的事情。
htanata

17

不幸的是,simple_form依赖于使用模型。本质上,拥有与它们的rails * _tag helper等效的诸如simple_form_tag和input_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错误。


2
这对我有用:<%= f.input:create_key,input_html:{value:nil},必填:true,提示:“仅通过邀请,请参阅电子邮件以获取密钥”%>
codenoob 2014年

1
如果使用集合,请使用selected代替value以避免undefined method 'name' for Model错误
fkoessler

13

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

您也可以为传递a:symbol而不是@objectas参数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

3
此选项仍使用内部模型。该符号应与模型名称匹配,它将解析为模型并创建一个新模型,并在每个字段上使用它,因此在表单字段中使用的属性应实际上存在于模型中。
米格尔·马德罗

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}" }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.