如何在不同的上下文中使用一个部分

时间:2012-07-28 09:37:51

标签: ruby-on-rails ruby view partial yield

我是rails的新手并尝试执行以下操作:

我想,因为我使用Bootstrap,有一个输入字段的部分,带有它的标签和一个小图标,在这种情况下称为符号。

以下是我的观点:

<%= form_for(@user, :class => "form-horizontal" ) do |f| %>
 <fieldset>
  <%= render 'shared/text_field', function: f, tag: :name, symbol: '<i class="icon-user"></i>' %> 

  <%= render 'shared/text_field', function: f, tag: :email, symbol: "@" %> 

  <%= render 'shared/password_field', function: f, tag: :password, symbol: '<i class="icon-log"></i>' %> 

  <%= render 'shared/password_field', function: f, tag: :password_confirmation, alt: "Passwort wiederholen", symbol: '<i class="icon-log"></i>' %>
  <!-- SUBMIT -->
  <%= f.submit "Anmeldung", :class => "btn btn-primary" %>
 </fieldset>
<% end %>


这里是正常输入字段的子部分:

<%= render 'shared/bootstrap/input_field' %>
<% content_for :label do %>
   <%= function.label tag, :class => "control-label", :for => "prependedInput" %>
<% end %>
<%content_for :symbol do %>
   <%= raw(symbol) %>
<% end %>
<% content_for :field do %>
   <%= function.text_field tag, :class => "input-xlarge", :id => "prependedInput", :size => "6" %>
<% end %>

(还有一个密码字段的子部分,基本上用function.input_field交换function.text_field)
这是渲染的input_field:

<div class="control-group">
  <%= yield :label %>
  <div class="controls">
    <div class="input-prepend">
      <span class="add-on"><%= yield :symbol %> </span>
  <%= yield :field %>
    </div>
  </div>
</div>

所以我的问题是:我怎样才能以一种简单易行的方式解决这个问题(这些事情在重构时会发生变得更糟,然后更好)我怎样才能让它发挥作用,因为到现在这样的事情发生了: http://pastebin.com/bNsgT9AR因此,对于内容和内容之前的每个content_的收益放入到该地方(最后一个除外)

听到你的好解决方案会很棒,在Rails中必须有一个更好的方式。

德国的问候;)

3 个答案:

答案 0 :(得分:2)

作为The Rails View的作者,我同意Ben Taitelbaum关于此的帖子,并说Formtastic对于这种复杂性来说完全是一个很好的选择。

关于您发布的代码,作为开发人员,我们希望避免这种全面的观看,因为它最终导致难以管理的混乱。编辑表单涉及的文件太多,在某些时候,其他一些开发人员会进入并覆盖我们的共享部分,而不知道它在何处使用,以改变不同表单的行为方式。我们可以从这种抽象中获得的代码重用的任何好处都被它与mutliple开发人员迅速恶化的可能性完全抹杀。

虽然Formtastic很棒,但我在最近的应用程序中也经常使用SimpleForm,特别是当我不需要Formtastic的全部功能时。

SimpleForm将处理您的标签,它也支持i18n。这将是:

<%= simple_form_for @user do |f| %>
  <%= f.input :name, :input_html => { :class => 'user-icon' } %>
  <%= f.input :email %>
  <%= f.input :password, :as => :password, :input_html => { :class => 'log-icon' } %>
  <%= f.input :password_confirmation, :as => :password, :input_html => { :class => 'log-icon' } %>
  <%= f.button :submit %>
<% end %>

然后在您的I18n文件中,您可以:

en:
  simple_form:
    labels:
      user:
        username: 'User name'
        password: 'Password'
        password_confirmation: 'Password confirmation'
de:
  simple_form:
    labels:
      user:
        username: 'Benutzername'
        password: 'Passwort'
        password_confirmation: 'Passwort wiederholen'

更多,因为你需要它。您也可以在i18n文件中定义提示和占位符。

另外,考虑将图标添加为CSS伪类:之后,并为需要在代码中添加的每个类执行此操作)

input.user-icon:after {
  // image as background, positioned properly, etc etc
}

input.log-icon:after {
  // image as background, positioned properly, etc etc
}

这样,您可以从ERB / HTML中删除此类内容并将其放在它所属的位置:在CSS(表示层)中。

答案 1 :(得分:0)

我觉得简单输入字段的泛化开销有点过多。 您是否考虑过简单地创建一个共享输入字段partial并且只是将字段名称(您将其命名为tag)和字段类型(text_field或password_field)作为参数传递?我可以看到你的方法可能更普遍,但如果你现在只需要这两个选项,请尽量保持简单。

添加回复评论:

您可以简单地将参数传递给您的部分,如下所示:

<%= render 'shared/error_messages', object: f.object %>

然后使用部分中的变量。在你的情况下你可以

<%= render 'shared/bootstrap/input_field',  function: f, tag: :name, input_field_type: :text_field %>

然后在_input_field.html.erb

<div class="control-group">
  <%= function.label tag, :class => "control-label", :for => "prependedInput" %>
... 

答案 2 :(得分:0)

The Rails View中有一个关于表单的很棒的部分,他们建议在这类事情中使用FormBuilders(他们还讨论formtastic,这值得一试)。

我从本书中得到的最大教训(我不能推荐它足够多!)是保持视图尽可能简单的重要性,因为它们往往是调试rails应用程序中最不有趣的部分,特别是随着应用程序变大。所以从这个角度来看,我希望视图很简单,比如:

<%= semantic_form_for(@user) do |f| %>
 <%= f.inputs do %>
   <%= f.input :name, class: 'icon-user' %>
   <%= f.input :email %>
   <%= f.input :password %>
   <%= f.input :password_confirmation %>
 <% end %>

 <%= f.buttons %>
<% end %>

以可读的视图作为目标开始,并根据需要为自定义字段类型添加必要的帮助程序和formbuilders。

我建议使用I18n将提交按钮文本设置为“Anmeldung”而不是硬编码。

我没有使用它,但您可能需要查看formtastic-bootstrap以获得所需的集成。