【问题标题】:RoR: Moving code from view to helperRoR:将代码从视图移动到助手
【发布时间】:2012-10-28 16:23:27
【问题描述】:

我试图最好地了解如何将 rail 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 行代码......

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

【问题讨论】:

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


【解决方案1】:

顺便说一下方法

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)

【讨论】:

  • 谢谢!显然这是一个更加优雅和高效的代码!但是,将视图逻辑移动到帮助器的原始问题仍然存在。我试图将 link_to 保留在视图中,并仅从帮助程序返回 link_to 数据,但这似乎也不起作用......
【解决方案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' %>

然后让你的局部视图有正确的视图。

【讨论】:

  • 谢谢!!决定将其作为部分执行,使用 render "fund_level_form", f:f, ad:ad 调用它。似乎工作得很好:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多