需要帮助干燥 - Rails 3.1

时间:2012-01-07 21:54:25

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

.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。
  3. 如果有人能提供任何帮助,我们将不胜感激。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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

  • 另一种方法是检查您所在的控制器并根据该代码生成所需的代码。例如

      

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

    一种更简洁的方式来删除if语句会像下面这样,但我已经尝试过了。

      

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

如果您需要更多帮助,请与我联系。