首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用助手澄清代码

使用助手澄清代码
EN

Stack Overflow用户
提问于 2017-08-18 22:08:30
回答 2查看 54关注 0票数 1

我有一个很大的注册表格,所以我只是给你看一个“小”的部分。

代码语言:javascript
复制
<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提供了一些帮助程序来简化某些场景中的代码。

我的问题能用帮手解决吗?如果可以的话,你觉得我该怎么处理呢?

谢谢,

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-08-18 22:20:42

我想说的是,你可能是在追求partial,而不是helper

我会制作一个名为eg:_form_field.html.erb的部分,内容如下:

代码语言:javascript
复制
<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>

然后称之为:

代码语言:javascript
复制
<%= render 'form_field', model: @users, field: :first_name, label: 'First name' %>

请注意,在这个部分中,我提取了一些变化为if-语句的比特,以避免重复不变化的html标记。这是可选的。如果你想的话,你可以把它留着。但是,无论哪种方法,都要将modelfieldlabel作为局部变量传递到其中的部分位置。

下面是关于partials的rails文档:rendering.html#using-partials

票数 2
EN

Stack Overflow用户

发布于 2017-08-18 22:37:58

我认为一个部分可能更干净,但你仍然需要一个助手,也许是这样的:

Helper

代码语言:javascript
复制
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

视图

代码语言:javascript
复制
<div class="input-element uk-margin-small-bottom uk-flex">
  <%= my_text_field(@user.errors[:first_name], f) %>
</div>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45765624

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档