对象的动态部分名称

时间:2011-07-18 13:22:14

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

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>

3 个答案:

答案 0 :(得分:2)

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

class SomeObject < AR::Base
  inheritance_column :data_type
end

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

这不是一个“动态”的解决方案,但我认为我会把它作为一个建议。

答案 1 :(得分:1)

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方法的String。

答案 2 :(得分:0)

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

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