【问题标题】:Extract to Rails helper提取到 Rails 助手
【发布时间】:2010-09-13 13:44:55
【问题描述】:

我想让这个东西更通用。

<%= form_for :page, :url => { :action => :create } do |form| %>
<div class="tabs">
  <ul>
  <% languages.each_with_index do |lang, i| %>
    <li><a href="#tabs-<%= i+1 %>"><%= lang %></a></li>
  <% end %>
  </ul>

  <% languages.each_with_index do |lang, i| %>
  <div id="tabs-<%= i+1 %>">
  <fieldset class="inputs">
  <ol>
    <li><%= form.label fname("title", lang), "Title" %>
    <%= form.text_field fname("title", lang), :size => 80, :class => "text" %></li>

    <li><%= form.text_area fname("content", lang), :cols => 40, :rows => 10 %></li>

    <li><%= form.label fname("published", lang), "Publish?" %>
    <%= form.check_box fname("published", lang) %></li>
  </ol>
  </fieldset>
  </div>
  <% end %>
</div>

它为每种语言生成一个选项卡和表单域。我也需要其他表单的这个选项卡,所以我想将“逻辑”提取到帮助器中。问题是,我不知道怎么做。

<%= form_for :page, :url => { :action => :create } do |form| %>
<% language_tabs do |lang| %>
   <li><%= form.label fname("title", lang), "Title" %>
   <%= form.text_field fname("title", lang), :size => 80, :class => "text" %></li>

   <li><%= form.text_area fname("content", lang), :cols => 40, :rows => 10 %></li>

   <li><%= form.label fname("published", lang), "Publish?" %>
   <%= form.check_box fname("published", lang) %></li>
<% end %>
<% end %>

【问题讨论】:

  • 嗨,查看我的更新答案

标签: ruby-on-rails ruby helper


【解决方案1】:

看起来很适合部分模板。 http://api.rubyonrails.org/classes/ActionView/Partials.html

我刚刚意识到你真正想要什么 :) 所以你可以结合部分和块助手,看看:

http://snippets.dzone.com/posts/show/2483

我会在 10 分钟内发布解决方案;)

你的解决方案来了:

1) application_helper.rb(或任何其他合适的帮助文件)添加:

def language_tabs(languages, &block) 
  tabs = []
  languages.each_with_index do |lang, i|
    tabs << render(:partial => 'tab', :locals => {:body => capture(lang, &block), :lang => lang, :i => i })
  end

  render(:partial => 'langtabs', :locals => {:languages => languages, :tabs => tabs})

end 

2) 部分_langtabs.html.erb

<div class="tabs">
  <ul>
  <% languages.each_with_index do |lang, i| %>
    <li><a href="#tabs-<%= i+1 %>"><%= lang %></a></li>
  <% end %>
  </ul>

  <% tabs.each do |cTab| %>
    <%= cTab %>
  <% end %>

</div>

3) 部分_tab.html.erb

<div id="tabs-<%= i+1 %>">
<fieldset class="inputs">
<ol>
  <%= body %>
</ol>
</fieldset>
</div>

4) 您的实际表单(注意:在我的示例中有一个名为 @languages 的变量!):

<%= form_for :page, :url => { :action => :create } do |form| %>
  <% language_tabs @languages do |lang| %>
     <li><%= form.label fname("title", lang), "Title" %>
     <%= form.text_field fname("title", lang), :size => 80, :class => "text" %></li>

     <li><%= form.text_area fname("content", lang), :cols => 40, :rows => 10 %></li>

     <li><%= form.label fname("published", lang), "Publish?" %>
     <%= form.check_box fname("published", lang) %></li>
  <% end %>
<% end %>

格鲁斯

西蒙

【讨论】:

    【解决方案2】:

    我不确定这是否正是您想要的,但这里有另一个建议:

    Rails I18n:http://guides.rubyonrails.org/i18n.html

    您不必为此创建助手,只需单独的 yml 文件来翻译每种语言。

    【讨论】:

    • 忘了语言,我要生成一个表格,分Tabs。每个选项卡都有相同的表单域。
    • 就像下面说的雪橇,你只需要部分。这样您就可以重复使用该特定表单
    【解决方案3】:

    检查Cells。您可以在类似控制器的类中编写具有自己逻辑的隔离(如果需要)、封装和可重用的组件(但要轻得多)。 适用于 Rails 3。

    【讨论】:

      猜你喜欢
      • 2011-08-13
      • 2023-03-26
      • 2010-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-21
      相关资源
      最近更新 更多