2010-09-13 57 views
1

我想让这个东西更通用。提取到Rails帮手

<%= 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 %> 
+0

嗨,结帐我更新的答案 – sled 2010-09-13 14:50:41

回答

2

看起来很适合部分模板。 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 %> 

Grüsse

西蒙

+0

WOW,太棒了!非常感谢! – Fu86 2010-09-14 07:44:48

0

我不知道这是否是你想要什么,但这里的另一个建议:

Rails的国际化:http://guides.rubyonrails.org/i18n.html

你不必做这个帮手,只是单独yml文件来翻译每种语言。

+0

忘记语言,我想生成一个表格,分为Tabs。每个选项卡具有相同的表单字段。 – Fu86 2010-09-13 13:54:55

+0

像雪橇下面说的,你只需要部分。所以你可以重用某种形式 – corroded 2010-09-13 14:04:42

0

检查Cells。您可以使用自己的逻辑编写独立的(如果需要的话),封装和可重用组件,但它们可以在类似控制器的分支(但要轻得多)中编写。 适用于Rails 3.