Динамическое частичное имя для объекта - PullRequest
0 голосов
/ 18 июля 2011
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 случае?

EDIT

Теперь я остановился на простейшем решении, которое не касалось моделей. Я удалил всю эту логику в _some_object.html.erb частичную, так что она отдает частичную часть, которая мне нужна, внутри себя:

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

Ответы [ 3 ]

2 голосов
/ 18 июля 2011

Если у вас есть предельный набор значений для поля data_type, вы можете создать подклассы из SomeObject, по одному для каждого типа данных.

class SomeObject < AR::Base
  inheritance_column :data_type
end

Тогда вы можете создать партиал по умолчанию для каждого подкласса.

Это не совсем "динамическое" решение, но я подумал, что выкину его как предложение.

1 голос
/ 18 июля 2011

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

Возможно, вам потребуется определить имя_модели для возврата строки, которая имеетОпределен метод частичный_путь.

0 голосов
/ 04 августа 2011

Теперь я остановился на простейшем решении, которое не касалось моделей.Я удалил всю эту логику в частичную _some_object.html.erb, поэтому она отдает частичную часть, которая мне нужна, внутри себя:

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