【问题标题】:Dynamic partial name for an object对象的动态部分名称
【发布时间】:2011-07-18 13:22:14
【问题描述】:
render @some_object

将渲染Rails.root/app/views/some_objects/_some_object.html.erb

现在我想处理哪个部分将被渲染取决于它的data_type 字段。例如:

class SomeObject < AR::Base
  # some magick method wich I need to rewrite
  def partial_name
    case data_type
    when "String"
      "string_template"
    when "Text"
      "text_template"
    else
      "blank_template"
    end
  end
end

我知道有model_namei18n_key 和其他一些,它们是返回模型名称,但在我的render @object 案例中使用的是哪一个?

编辑

现在我已经停止了不涉及模型的最简单的解决方案。我将所有这些逻辑删除到 _some_object.html.erb 部分中,所以它呈现了我需要的部分:

<div class='claim_template_field'>
  <%= render "/some_objects/#{f.object.data_type.downcase}_template", :f => f %>
</div>

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3 activerecord partial


    【解决方案1】:

    如果您有一组有限的 data_type 字段值,您可以从 SomeObject 创建子类,每个 data_type 一个。

    class SomeObject < AR::Base
      inheritance_column :data_type
    end
    

    然后你可以为每个子类创建一个默认的部分。

    这并不完全是一个“动态”解决方案,但我想我会把它作为一个建议扔掉。

    【讨论】:

    • 确实是动态的,但是用我的mongodb数据方案会太复杂
    【解决方案2】:

    actionpack/lib/view/action_view/render/partials.rb 定义了一种确定对象部分路径的方法:

          def partial_path(object = @object)
            @partial_names[object.class.name] ||= begin
              object = object.to_model if object.respond_to?(:to_model)
    
              object.class.model_name.partial_path.dup.tap do |partial|
                path = @view.controller_path
                partial.insert(0, "#{File.dirname(path)}/") if partial.include?(?/) && path.include?(?/)
              end
            end
          end
    

    您可能需要定义 model_name 以返回一个定义了 partial_path 方法的字符串。

    【讨论】:

      【解决方案3】:

      现在我已经停止了不涉及模型的最简单的解决方案。我将所有这些逻辑删除到 _some_object.html.erb 部分中,因此它呈现了我需要的部分:

      <div class='claim_template_field'>
        <%= render "/some_objects/#{f.object.data_type.downcase}_template", :f => f %>
      </div>
      

      【讨论】:

        猜你喜欢
        • 2021-03-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-15
        • 2010-12-20
        • 2013-09-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多