RoR:将代码从视图移动到帮助程序

时间:2012-10-28 16:23:28

标签: ruby-on-rails ruby view-helpers

我正在努力最好地了解如何将铁路助手与haml视图一起使用。

我有一个最初包含此逻辑的视图

=   fund_levels_last(i, @fund_level_count) ? ( link_to "add new level", ad, {class: 'button orange sm'} ) : ( link_to "remove", accounts_ad_fund_level_path(ad, fl.object.id), {:class => 'button orange sm', :method => :delete, :remote => true, :confirm => t('q.are_you_sure')} )

为了让视图尽可能地保持清晰,我一直试图将这个逻辑移到帮助器上。

   def fund_levels_last(i, flcount)
     if i ==  flcount
       true
     else
       false
     end
   end

   def fund_levels_btn(i, flcount)
     if self.fund_levels_last(i, flcount)
       link_to "add new level", ad, {class: 'button orange sm'}
     else
       link_to "remove", accounts_ad_fund_level_path(ad, fl.object.id), {:class => 'button orange sm', :method => :delete, :remote => true, :confirm => t('q.are_you_sure')}
     end
   end

但是,在帮助程序中,我无法访问视图中的变量和对象(ad,object,fl等)。我认为我可以将所有这些传递给辅助方法,但不知何故,这似乎太复杂了,我感觉我在这里走错了轨道。我在视图中的单行代码似乎最终在帮助程序中有15行代码......

将此逻辑从视图移动到帮助器的最简单方法是什么?

2 个答案:

答案 0 :(得分:3)

顺便说一下,方法

def fund_levels_last(i, flcount)
  if i ==  flcount
    true
  else
    false
  end
end

可能只是:

def fund_levels_last(i, flcount)
  i ==  flcount
end

并且,返回布尔值的方法通常以?结束,因此它将变为def fund_levels_last?(i, flcount)

答案 1 :(得分:2)

如果您的代码足够简单,您实际上可能需要部分代码。然后你可以像这样传递代码/变量:

<%= render :partial => 'funds/partial_view', :locals => { :var => variable } %>

但如果您需要助手,则必须传递参数:

def funds_helper(var) //do something interesting end

但是,没有理由将所有逻辑从视图中删除,而是将其分解为部分:

控制器中的

@fund_level = fund_levels_last(i, @fund_level_count)

在视图中: <%= @fund_level ? render :partial => 'funds/add_new_level' : render :partial => 'funds/remove_level' %>

然后让您的部分视图具有正确的视图。