Rails 3, рендеринг частичного для данного контроллера, если он существует? - PullRequest
5 голосов
/ 18 марта 2011

В моем макете application.html.erb для моего приложения я хочу иметь партиал, который отображается, если он существует для данного представления. например.

Если посетитель на http://example.com/users/show, я бы хотел, чтобы частичное /users/_sidebar.html.erb отображалось.

Но если бы посетитель сказал, например, http://example.com/user/locations/san_francisco, я бы хотел, чтобы частичное /users/locations/_sidebar.html.erb отображалось.

Таким образом, здесь дело в том, что если бы не было частичного для этого контроллера / действия, он бы сделал какую-то общую частичную в моей общей директории, и я бы предпочел не засорять каждый отдельный вид content_for блоками, знаете ли?

Есть идеи, ребята?

Ответы [ 2 ]

4 голосов
/ 20 июля 2011

Мое решение немного другое. Добавьте это в свой помощник приложения:

  def render_partial_if_exists(base_name, options={})

    file_name           = ::Rails.root.to_s+"/app/views/layouts/_#{base_name}.html.erb"
    partial_name        = "layouts/#{base_name}"
    else_file_name      = ::Rails.root.to_s+"/app/views/layouts/_#{options[:else]}.html.erb"
    else_partial_name   = "layouts/#{options[:else]}"

    if File.exists?(file_name)
      render :partial => partial_name
    elsif (options.key?(:else) and !options[:else].nil? and File.exists?(else_file_name))
        render :partial => else_partial_name
    end
  end

Тогда по вашему мнению:

<%= render_partial_if_exists "page_#{controller.action_name}_sidebar", :else => "page_sidebar" %>

В действии редактирования, если существует "layouts / page_edit_sidebar", он отрисовывает его, в противном случае он выводит резервный "layouts / page_sidebar"

2 голосов
/ 18 марта 2011

У Шона Бехана есть отличный пост именно об этом:

http://seanbehan.com/programming/render-partial-if-file-exists/

Я мог бы переместить его к помощнику и немного подправить:

<%= render_sidebar %>

# This method could use either the rescue or the if file exists technique.
def render_sidebar
  render(:partial => "/#{controller.name}/sidebar"
rescue
  #default side bar
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...