【问题标题】:Need Help DRYing things up - Rails 3.1需要帮助干燥 - Rails 3.1
【发布时间】:2012-02-05 02:26:59
【问题描述】:
.row
    .nine.columns.centered
        %ul.bucketlist

            - @buckets.each_with_index do |resource, index|
                %a{:href => "#{bucket_path(resource)}"}
                    %li.bucket
                        %h4= index + 1
                        %h5= resouce.name

            %a{:href => "#{new_bucket_path}"}
                %li.bucket.empty
                    = image_tag "add.gif"
                    %h5 Add Bucket

我用 3 个不同的视图编写了上面的代码,它们之间只有细微的差别。这对我来说似乎不是很干燥,所以我正在寻找一些帮助来清理它。

视图之间只有几处不同:

  1. @buckets.each - @buckets 集合也需要在 @notes@units 之间切换。
  2. #{bucket_path} - 我希望能够传入一个变量,以便 bucket_path 成为 resource_path。

如果有人可以提供任何帮助,将不胜感激。

【问题讨论】:

    标签: ruby-on-rails-3.1 views haml dry


    【解决方案1】:
    • 一种解决方案是编写一个辅助函数来生成 html。 人们通常不喜欢帮助程序中的 html,但在这种情况下 会是个好主意。在传入资源的地方编写一个函数 名称,它会为您生成此代码

    • 另一种方法是检查您所在的控制器并在此基础上生成所需的代码。比如

      resource = @buckets if params[controller]=='bucket'

      删除 if 语句的更简洁的方法类似于以下内容,但我没有尝试过。

      exec "resource = @#{params[:controller]}s"

    如果您需要更多帮助,请告诉我。

    【讨论】:

    • 我喜欢辅助函数的想法,但不完全确定如何做到这一点。除了在 content_tags 中嵌套结构 HTML 之外,我将如何重新创建锚点及其子项?
    【解决方案2】:

    我对haml的经验有限,但我认为您应该能够将通用代码放入部分(例如名为_common.html.haml的文件),然后在视图中简单地执行:

    = render 'common', :items => @buckets, :new_item_path => new_bucket_path
    

    然后像这样改变部分:

    %ul.bucketlist
        - items.each_with_index do |resource, index|
            %a{:href => url_for(resource)}
                %li.bucket
                    %h4= index + 1
                    %h5= resouce.name
    
        %a{:href => "#{new_item_path}"}
            %li.bucket.empty
                = image_tag "add.gif"
                %h5 Add Item
    

    【讨论】:

    • 看起来不错,但是将路径传递到 Partial 时出现问题。我需要将路径输出为 bucket_path(bucket),那么如何将其发送到部分?
    • 也许你可以通过使用 url_for 帮助器来完全删除路径参数? url_for(resource) 应该为您提供每个项目的正确网址。
    • 好主意:D 现在一切正常,除了我不知道如何将 new_resource_path 传递到 .each 块之外的部分(new_resource_path)?
    • 和上面的 :path 一样,只是在你的视图中传入:new_item_path => new_bucket_path,并在部分引用new_item_path 代替new_bucket_path。我更新了答案以使其更清晰。
    猜你喜欢
    • 2011-10-21
    • 1970-01-01
    • 1970-01-01
    • 2011-11-10
    • 1970-01-01
    • 2020-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多