2010-11-09 4 views
0

J'ai plusieurs de ceci, où la seule chose qui diffère est si c'est un text_field ou un password_field etc etc Je voudrais passer cela comme un paramètre au rendu, comme: as =>: password_field par exemple. Et je ne veux pas faire une comparaison de cas, la valeur passée dans le: tel est la valeur du champ. Est-ce possible ?SEC-moi. Rails code:


.text{:class => form.object.errors[field].any? ? "error" : nil} 
    = form.label field 
    -if defined? value 
    = form.text_field field, :value => value 
    -else 
    = form.password_field field 
    -if defined? hint 
    %p#hint= hint 
    = render 'shared/error_messages', :object => form.object, :field   

.text{:class => form.object.errors[field].any? ? "error" : nil} 
    = form.label field 
    -if defined? value 
    = form.text_area field, :value => value 
    -else 
    = form.text_area field 
    -if defined? hint 
    %p#hint= hint 
    = render 'shared/error_messages', :object => form.object, :field => field 

réponse est celui ci-dessous, avec quelques corrections:


-# expects form, field_name, field_type, value and hint variables to be passed 
.text{:class => form.object.errors[field_name].any? ? "error" : nil} 
    = form.label field_name 
    - if defined?(value) 
    = form.send(field_type, field_name, :value => value) 
    - else 
    /= form.send(:field_type, field_name) 
    = form.send(field_type, field_name) 
    -if defined? hint 
    %p#hint= hint 
    = render 'shared/error_messages', :object => form.object, :field => field_name   

Utilisation: = render 'shared/form_field', :form => f, :field_name => :email, :field_type => :text_field

Répondre

1

Créer une appelée partielle shared/form_field.html.haml

- # expects form, field_name, field_type, value and hint variables to be passed 
.text{:class => form.object.errors[field_name].any? ? "error" : nil} 
    = form.label field_name 
    - if defined?(value) 
    = form.send(:field_type, field_name, :value => value) 
    - else 
    = form.send(:field_type, field_name) 
    -if defined? hint 
    %p#hint= hint 
    = render 'shared/error_messages', :object => form.object, :field => field_name 

Vous pouvez invoquer la partielle

- form_for :user do |form| 
= render 'shared/form_field', :locals => {:form => form, 
         :field_name => :login, :field_type => :text_field} 
+0

Oui, monsieur, il suffit de trouver la réponse – daniel

+0

Il semble que form.send (: field_type, field_name) est le même que form.send (: field_type, field_name,: value => value) dans les deux cas, il imprime la valeur si la valeur n'est pas nulle, pourquoi? – daniel

1

Si je comprends bien votre question à droite, vous êtes après:

render :partial => 'user/login_errors', :locals => { :field => :first_name, :value => @user.first_name, :form => form } 

Vous utilisez le hachage local pour transmettre un nombre quelconque de variables. Dans votre cas, les variables de votre extrait de code étaient form, field et value. Les clés du hachage déterminent la référence de la variable comme dans le partiel, et les valeurs dans le hachage déterminent les valeurs de la variable.

Questions connexes