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_name
,i18n_key
和其他一些,这些是返回的模型名称,但在render @object
案例中使用了哪一个?
修改
现在我已经停止了最简单的解决方案,它没有触及模型。我将所有这些逻辑移除到_some_object.html.erb
部分,因此它在内部呈现我需要的部分:
<div class='claim_template_field'>
<%= render "/some_objects/#{f.object.data_type.downcase}_template", :f => f %>
</div>
答案 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>