使用帮助程序来澄清代码

时间:2017-08-18 22:08:30

标签: ruby-on-rails ruby

我有这个非常庞大的注册表格,所以我只是向你展示一个小小的"一部分。

overflow-y: auto

这是每个输入的逻辑,架构是相同的:

  • 将工具提示添加到字段有错误的部分
  • 添加一个区分有错误和没有错误的字段的CSS类

它导致大量的HTML / Ruby代码用于相同的通用机制。我知道Rails提供了一些帮助来缓解某些情况下的代码。

帮助者可以解决我的问题吗?如果可以,你怎么认为我应该处理它?<​​/ strong>

谢谢,

2 个答案:

答案 0 :(得分:2)

我说你可能在partial而不是helper之后。

我做了一个名为eg _form_field.html.erb的部分内容,例如:

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

然后称之为:

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

请注意,在部分中,我已经删除了变为if语句的位,以避免重复不会变化的html标记。这是可选的......如果你愿意的话,你可以把它留在原处。但无论哪种方式,请将modelfieldlabel作为局部变量传递给您。

这里有部分的导轨doco:http://guides.rubyonrails.org/layouts_and_rendering.html#using-partials

答案 1 :(得分: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>