重构:渲染按钮并用div包装

时间:2011-06-09 08:27:14

标签: ruby-on-rails ruby

我的许多网页都包含一个动作元素,如下例所示。

我想知道是否有可能将其重构为帮助者或部分帮助者。起初它看起来很简单 - 只需创建一个包装按钮div的帮助器。但是我无法弄清楚如何在渲染所有按钮时包装动作div。猜猜它必须被缓存或其他东西。

<div class="actions">
  <div class="button box shadow">
    <span class="customclass1"></span>
    <a href="/">button1</a>
  </div>
  <div class="button box shadow">
    <span class="customclass2"></span>
    <a href="/">button2</a>
  </div>
  <div class="button box shadow">
    <span class="customclass3"></span>
    <a href="/">button3</a>
  </div>
  ... maybe another button
</div>

更新:这是我在玩完游戏后的方式:

视图

<% button 'ui-icon-plusthick', (link_to "New", new_art_path) %>
<% button 'ui-icon-pencil', (link_to "Edit", edit_art_path(@art)) %>
<% button 'ui-icon-trash', (link_to 'Destroy', @art, method: :delete) %>
<%= display_actions %>

application_helper

def button(ui_icon_class, link)
  if @buttons.nil? then @buttons = '' end
  @buttons += ('
  <div class="unit mrm ui-accordion-header ui-helper-reset ui-state-default ui-corner-all">
    <span class="ui-icon ' + ui_icon_class + '"></span>' + link + 
  '</div>')
end

def display_actions
  unless @buttons.nil?
    ('<div class="line mlm mbm ui-accordion ui-widget ui-helper-reset ui-accordion-   icons">' +
        @buttons +
    '</div>').html_safe
  end   
end

这样我就可以非常轻松地添加支票 - 隐藏用户无权使用的链接。

  

&lt;%button'ui-icon-trash',(link_to   'Destroy',@ art,method :: delete)if   能够? :destroy,@ art%&gt;

祝你好运。 AsbjørnMorell

1 个答案:

答案 0 :(得分:1)

这是你要追求的那种东西吗?

您的观点:

<div class="actions">
  <% render 'button', :custom_class => "customclass1", :button_text => "button1" %>
  <% render 'button', :custom_class => "customclass2", :button_text => "button2" %>
  ... etc.
</div>

_button.html.erb:

<div class="button box shadow">
  <span class="<%= custom_class %>"></span>
  <a href="/"><%= button_text %></a>
</div>

如果您希望通过创建一个只传递选项的帮助器并且负责使用正确的选项渲染按钮部分,您可以进一步重构。

类似的东西:

您的观点:

&lt;%display_actions(['someclass1','button1'],['someclass2','button2'])%&gt;

你好帮手:

def display_actions(*options)
  html = '<div class="actions">'
  options.each do |opt|
    # Not tested, but you get the idea
    html += render('button', :custom_class => opt.first, :button_text => opt.last)
  end
  html += '</div>'
end