【问题标题】:Rails 3 refactoring issueRails 3 重构问题
【发布时间】:2011-01-04 02:52:14
【问题描述】:

以下视图代码生成一系列带有总计的链接(如预期的那样):

<% @jobs.group_by(&:employer_name).sort.each do |employer, jobs| %>
    <%= link_to employer, jobs_path() %> <%= "(#{jobs.length})" %>
<% end %>

但是,当我重构视图的代码并将逻辑移至帮助程序时,代码无法按预期工作。

查看:

<%= employer_filter(@jobs_clone) %>

帮手:

def employer_filter(jobs)
    jobs.group_by(&:employer_name).sort.each do |employer,jobs|
        link_to employer, jobs_path()
    end   
end

生成以下输出:

<Job:0x10342e628>#<Job:0x10342e588>#<Job:0x10342e2e0>Employer A#<Job:0x10342e1c8>Employer B#<Job:0x10342e0d8>Employer C#<Job:0x10342ded0>Employer D#

我不明白什么?乍一看,代码似乎是等价的。

【问题讨论】:

    标签: refactoring view group-by ruby-on-rails-3 helpers


    【解决方案1】:

    在第一个示例中,它直接输出到erb,在第二个示例中,它返回该方法的结果。

    试试这个:

    def employer_filter(jobs)
        employer_filter = ""
        jobs.group_by(&:employer_name).sort.each do |employer,jobs|
            employer_filter += link_to(employer, jobs_path())
        end   
        employer_filter
    end
    

    然后在视图中这样调用:

    raw(employer_filter(jobs))
    

    还要注意“原始”的使用。将字符串的生成移出模板后,您需要告诉 rails 您不希望它在 html 中转义。

    对于额外的功劳,您可以使用“inject”命令而不是显式构建字符串,但我很懒,想给您我所知道的无需测试即可工作的内容。

    【讨论】:

    • 关闭。它返回像 Employer A 这样的值,而不是实际的链接。我很想看看 .inject 语法。 OrderedHash(这是其中之一)是否支持 .collect 方法?
    • “实际链接”是什么意思?
    • 而不是链接,锚标记显示为如上所述 - 作为文本。我认为这被称为“逃脱”。
    • 好的,成功了。您能解释一下为什么函数的工作方式与直接嵌入 ERB 的逻辑不同吗?我还有其他帮助函数可以处理数组并按预期工作:args.collect { |bucket| link_to bucket, jobs_path() }.join(' | ').html_safe 有什么区别?
    • "collect" 返回您操作的所有内容的总和..."each" 将作用于每个对象,但只返回最后一个。
    【解决方案2】:

    这个语法如我所愿:

    def employer_filter(jobs_clone)
        jobs_clone.group_by(&:employer_name).sort.collect { |group,items|
            link_to( group, jobs_path() ) + " (#{items.length})"
        }.join(' | ').html_safe
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-29
      • 2011-09-12
      • 2011-09-13
      相关资源
      最近更新 更多