Условные операторы Rails ('if'), основанные на действии контроллера - PullRequest
29 голосов
/ 25 августа 2009

Возможно, есть лучший способ сделать это, но я пытаюсь сделать оператор if в rails, основываясь на текущем действии, в контроллере (это будет использоваться в представлении).

Например, если это страница редактирования или страница показа и т. Д. Я бы хотел другой стиль для чего-нибудь - есть ли оператор if, который может это указать?

(мне нужно выражение if, потому что оно используется частично, на нескольких страницах).

Спасибо!

Эллиот

Ответы [ 4 ]

49 голосов
/ 25 августа 2009

Хэш params, доступный в контроллере, содержит ключи :controller и :action, которые задают имена контроллера и действия запроса.

Поэтому вы могли бы сказать

if params[:action] == "foo"
  # Show stuff for action 'foo'
elsif params[:action] == "bar"
  # Show stuff for action 'bar'
elsif ...
  # etc.
end
23 голосов
/ 25 августа 2009

Не рекомендуется, чтобы в IMO были партиалы, спрашивающие, каков текущий контроллер и имена действий. Подумайте «скажи, не спрашивай» (http://www.pragprog.com/articles/tell-dont-ask). То есть вместо того, чтобы иметь частичный запрос вызывающего абонента о его состоянии, сказать частичное, что вы хотите, чтобы он сделал.

Один из способов сделать это - передать переменные в парциальное через параметр locals:

<%= render :partial => "/common/toolbar", :locals => {:edit => true} %>

Тогда в частичном:

<% if defined?(edit) && edit %>
... stuff appropriate to edit mode
<% end %>
3 голосов
/ 25 августа 2009

Вы можете сделать это так:

class ApplicationController < ActionController::Base
  layout :set_layout

  def set_layout
    case params[:action]
    when "foo"
      "foo_layout"
    when "bar"
      "bar_layout"
    ...
    else
      "default_layout"
    end
  end

  ...

end

надеюсь, это поможет =)

1 голос
/ 25 августа 2009

Вы также можете использовать макеты для партиалов:

<%= render :partial => 'some_partial', :layout => 'wrap_with_stuff' %>

Если вы хотите решить, какой макет использовать динамически, я бы добавил это в помощник. Таким образом, вы в конечном итоге с

# In your view

<%= render :partial => 'some_partial', :layout => layout_for_my_partial %>

# In your helper

def layout_for_my_partial
    params[:action] == 'show' ? 'show_wrapper' : 'everything_else_wrapper'
end

Это будет работать только при некоторых обстоятельствах, но может быть тем, что вы пытаетесь сделать.

Подробнее здесь.

http://ryandaigle.com/articles/2007/8/3/what-s-new-in-edge-rails-partials-get-layouts

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...