【问题标题】:Refactor Rails 3 views - move logic to <model>_helper重构 Rails 3 视图 - 将逻辑移动到 <model>_helper
【发布时间】:2010-12-13 15:13:28
【问题描述】:

我想将以下内容从我的视图移动到模型的关联助手中:

<%= link_to_unless params[:aged]=='0', "0", jobs_path(:aged => '0', :sort=>params[:sort],:dir=>params[:dir],:fav=>params[:fav]) %> |
<%= link_to_unless params[:aged]=='30', "30", jobs_path(:aged => '30', :sort=>params[:sort],:dir=>params[:dir],:fav=>params[:fav]) %> |
<%= link_to_unless params[:aged]=='60', "60", jobs_path(:aged => '60', :sort=>params[:sort],:dir=>params[:dir],:fav=>params[:fav]) %> |
<%= link_to_unless params[:aged]=='90', "90", jobs_path(:aged => '90', :sort=>params[:sort],:dir=>params[:dir],:fav=>params[:fav]) %>

我已经尝试过了,但它会导致 UNEXPECTED IDENTIFIER 错误(显然我需要将 link_to_unless 的结果连接到“|”):

link_to_unless params[:aged]=='0', "0", users_path(:aged=>'0',:sort=>params[:sort],:dir=>params[:dir],:fav=>params[:fav]) |
link_to_unless params[:aged]=='30', "30", users_path(:aged=>'30',:sort=>params[:sort],:dir=>params[:dir],:fav=>params[:fav]) |
link_to_unless params[:aged]=='60', "60", users_path(:aged=>'60',:sort=>params[:sort],:dir=>params[:dir],:fav=>params[:fav]) |
link_to_unless params[:aged]=='90', "90", users_path(:aged=>'90',:sort=>params[:sort],:dir=>params[:dir],:fav=>params[:fav])

看来我需要将这些辅助方法的结果插入到 HTML 流中,但我不确定最好的方法。

既然 Rails 3 一直都包含所有助手(助手:所有),有没有办法指示模型的视图只使用与模型关联的助手?此时,我将模型的名称添加到函数的名称中——例如,“jobs_sorted_column”。

** 编辑 **

重构

jobs_helper:

  def posted_filter(bucket)

    link_to_unless params[:posted]==bucket, bucket, jobs_path(:posted =>bucket, :starting=>params[:starting],:sort=>params[:sort],:dir=>params[:dir])

  end

查看:

[ <% ['0','30','60','90'].each do |bucket| %>
    <%= posted_filter(bucket) %> |
<% end %> ]

问题:

  • 结果输出看起来像 [ 0 | 30 | 60 | 90 | ]。是否有一个简单的修复方法来删除第 4 个“|”?
  • 似乎有一种更优雅的方式将参数传递给路由,包括一个“覆盖”值(在我的示例中为:posted=>bucket)。

【问题讨论】:

    标签: views helpers ruby-on-rails-3


    【解决方案1】:

    尝试使用collectjoin,类似:

    <%= ['0','30','60','90'].collect{ |x| "#{posted_filter(x)}" }.join(' | ') %>
    

    见:Array #collect

    【讨论】:

      【解决方案2】:

      你可以做得更好:

      def posted_filters(*args)
        args.collect { |bucket|
          link_to_unless(params[:posted]==bucket, bucket, jobs_path(:posted =>bucket, :starting=>params[:starting],:sort=>params[:sort],:dir=>params[:dir]))
        }.join(' | ').html_safe
      end
      

      在你的视图代码中:

      [ <%= posted_filters(0, 30, 60, 90) %> ]
      

      【讨论】:

      • 我喜欢这种方法,但是当我将代码添加到关联的帮助程序时,结果是转义 HTML 的文本字符串,而不是链接。我错过了什么吗?
      • 不。仍然类似于 [ 0 | ...
      • 成功了,谢谢。关于如何以 DRYer 方式传递参数的任何想法?我需要覆盖 :posted 参数;其他人可以保持当前状态。
      猜你喜欢
      • 2016-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多