【问题标题】:DRY me. Rails code:擦干我。导轨代码:
【发布时间】:2010-11-10 11:18:31
【问题描述】:

我有几个这样的,唯一不同的是它是 text_field 还是 password_field 等等等等。 我想将此作为参数传递给渲染,例如 :as => :password_field 。 而且我不想进行大小写比较,在 :as 中传递的值是该字段的值。这可能吗?


.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 

答案如下,有一些修复:


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

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

【问题讨论】:

    标签: ruby-on-rails dry


    【解决方案1】:

    创建一个名为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 
    

    您可以调用部分 as

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

    【讨论】:

    • 是的,先生,足以得出答案
    • 似乎 form.send(:field_type, field_name) 与 form.send(:field_type, field_name, :value => value) 在两种情况下都相同,如果 value 不是则打印值null,任何想法为什么?
    【解决方案2】:

    如果我理解你的问题,那么你就是这样:

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

    您使用本地哈希来传递任意数量的变量。在您的情况下,您的代码 sn-p 中的变量是 formfieldvalue。散列中的键决定了将在部分中引用的变量,而散列中的值决定了变量的值。

    【讨论】:

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