2017-08-18 5 views
1

私はこのサインアップフォームを持っていますので、私はちょうどあなたに "小さな"部分を示しています。コードを明確にするためにヘルパーを使用してください

<div class="input-element uk-margin-small-bottom uk-flex"> 
    <% if @user.errors[:first_name].any? %> 
    <div class="uk-inline uk-width-1-2" title="<%= @user.errors[:first_name].first %>" uk-tooltip="pos: left"> 
     <span class="uk-form-icon" uk-icon="icon: user"></span> 
     <%= f.text_field :first_name, placeholder: "First name", class: "uk-input uk-form-danger" %> 
    </div> 
    <% else %> 
    <div class="uk-inline uk-width-1-2"> 
     <span class="uk-form-icon" uk-icon="icon: user"></span> 
     <%= f.text_field :first_name, placeholder: "First name", class: "uk-input" %> 
    </div> 
    <% end %> 
</div> 

これは、すべての単一の入力ためのロジックで、スキーマが同じである:

  • は、フィールドがエラー
  • がいることをCSSクラスを追加している部分にツールチップを追加エラーの有無にかかわらずフィールドを区別する

これは、同じ共通メカニズムのための膨大な量のHTML/Rubyコードにつながります。私はRailsが特定のシナリオでコードを簡単にするためのヘルパーを提供していることを知っています。

私の問題はヘルパーで解決できますか?それができれば、私はそれをどう扱うべきだと思いますか?

おかげで、

+0

モデルに必要なフィールドを検証していますか?おそらく最も簡単にそれを調整するいくつかのエラーを表示する必要があります。 –

+0

@RockwellRice私の説明ではわかりませんが、コードの観点からは問題はありません。すべて正常に動作しており、エラーメッセージが正しく表示されます。 私の唯一の問題はコードの可読性であり、フィールド間で自分自身を繰り返す気がします。 **ヘルパーとの可読性を向上させるにはどうすればいいですか?** –

答えて

2

私はあなたがpartialないhelper後、おそらくだと思います。

私は、例えばと呼ばれる部分を作ると思います。その後、

<div class="input-element uk-margin-small-bottom uk-flex"> 
    <% 
    if model.errors[:field].any? 
    title = model.errors[:field].first 
    tooltip = 'pos: left' 
    input_extra_class = 'uk-form-danger' 
    else 
    title = '' 
    tooltip = '' 
    input_extra_class = '' 
    end 
    %> 
    <div class="uk-inline uk-width-1-2" title="<%= title %>" uk-tooltip="<%= tooltip %>"> 
    <span class="uk-form-icon" uk-icon="icon: user"></span> 
    <%= f.text_field :field, placeholder: label, class: "uk-input <%= input_extra_class %>" %> 
    </div> 
</div> 

など、それを呼び出す:のような内容で_form_field.html.erb

<%= render 'form_field', model: @users, field: :first_name, label: 'First name' %> 

注意を部分的に、私が引き出されていることをビットはifステートメントに変わりますが、変化しないhtmlマークアップを複製しないようにします。それはオプションです...あなたが望むのであれば、それをそのまま残すことができます。しかしいずれにしても、modelfield、およびlabelをローカル変数として渡す部分を作成します。

はここでレールがパーシャルにDOCOです:http://guides.rubyonrails.org/layouts_and_rendering.html#using-partials

+0

フィールドの配列を使って、これを素早く呼び出すことができます。たとえば、次のようにします: '<%[:first_name、:last_name、other_field] .each do | %> 'に変更して、コールラインを' <%= render 'form_field'、model:@users、field:field、label:field.to_s.humanize%> 'に変更します。もちろん、その後には '<% end %>'となります。 – moveson

+0

ありがとうございます、解決策は動作しています。しかし、私は部分的に変数を渡す別の方法を見つけました(https:// stackoverflow。com/questions/6672454/passing-parameters-to-partial-view)、私の意見ではうまくいきます。 –

1

私は部分的にはきれいかもしれないが、あなたはまだ多分、このようなものヘルパーを使用できると思います:

ヘルパー

def my_text_field(errors, element) 
    div_options = { class: "uk-inline uk-width-1-2" } 
    input_class = "uk-input" 

    if errors.any? 
    div_options.merge(title: errors.first, "uk-tooltip": "pos: left") 
    input_class << " uk-form-danger" 
    end 

    content_tag(:div, div_options) do 
    content_tag(:span, class: "uk-form-icon", "uk-icon": "icon: user") do 
     element.text_field :first_name, placeholder: "First name", class: input_class 
    end 
    end 
end 

表示

<div class="input-element uk-margin-small-bottom uk-flex"> 
    <%= my_text_field(@user.errors[:first_name], f) %> 
</div> 
関連する問題