2011-03-03 7 views

Respuesta

107

Puede utilizar :symbol como primer argumento.

<%= simple_form_for :user, url: users_path do |f| %> 
    <%= f.input :name, as: :string %> 
    ... 
<% end %> 

Es seria algo como esto:

<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> 
+0

Aunque no tiene sentido, ¿no? No obtiene ninguno de los beneficios de simple_form_for cuando está utilizando los generadores de campo de texto alternativo. – toxaq

+3

@toxaq Quizás ese no sea un buen ejemplo. Puede usar 'f.input: name,: as =>: string' y generar su forma habitual con etiqueta, sugerencias, etc. – htanata

+6

Extrañamente, eso es exactamente lo que estoy tratando de hacer y no tener éxito. ¿Tu ejemplo da un nombre de "método indefinido"? para nada: NilClass' para mí al menos. – toxaq

2

También podría pasar un :symbol en lugar de @object como argumento para simple_form_for.

<%= simple_form_for :email, :url => '/post_email' do |f| %> 
    <%= f.input :subject, :as => :string %> 
<% end %> 

Qué sería de salida:

<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> 

Tenga en cuenta las siguientes extracciones espaldas:

  • Usted no será capaz de tomar ventaja de la validación de modelos automática
  • Necesidad para definir explícitamente :url y el tipo de cada input
+3

Esta opción todavía usa un modelo debajo de las cubiertas. El símbolo debe coincidir con el nombre de un modelo, se resolverá en un modelo y creará uno nuevo y lo usará en todos los campos, por lo que las propiedades utilizadas en los campos de formulario realmente deberían existir en el modelo. –

13

Lamentablemente, simple_form se basa en el uso de un modelo. En esencia, sería bueno tener algo así como los métodos simple_form_tag y input_tag equivalentes a sus rails * _tag helpers. Hasta entonces, hay un trabajo fácil.

Use un símbolo en lugar de la clase en el formulario y pase el valor explícitamente para evitar que simple_form intente acceder a las propiedades del modelo.

<%= simple_form_for :user, :url => '/users' do |f| %> 
    <%= f.text_field :name, input_html: { value: nil } %> 
<% end %> 

Esto evitará el error undefined method 'name' for User.

+2

Esto funcionó para mí: <% = f.input: create_key, input_html: {value: nil}, required: true, sugerencia: "solo por invitación, vea la clave de correo electrónico"%> – codenoob

+1

Si trabaja con una colección, use ' seleccionado' en lugar de 'valor' para evitar el' método indefinido 'nombre' para error de Modelo' –

3

Todos los métodos anteriores aún le dejan datos de formulario anidados dentro de "usuario" o cualquier símbolo que pase como primer argumento. Eso es molesto.

Para imitar el estilo/ventajas de simple_form, pero elimine la dependencia de objeto/símbolo y el anidamiento de datos forzados, puede crear un parcial.

HAML ejemplos:

forma de vista:

= form_tag("path/to/action", method: "POST") do 
    = render "path/to/partial/field", type: "string", required: true, item: "first_name" 

field parcial:

- 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}" } 
6

También puede utilizar campos fuera el modelo dentro de un modelo forma, con simple_fields_for como esto:

<%= simple_form_for @user do |f| %> 
    <%= f.input :name %> 

    <%= simple_fields_for :no_model_fields do |n| %> 
    <%= n.input :other_field %> 
    <% end %> 
<% end %> 

Esta es una solución simple y práctica, porque puede crear diferentes tipos de campos de diferentes modelos o sin usar los modelos

Cuestiones relacionadas