Rails устанавливает макет на основе параметров URL

Итак, я пытаюсь изменить макет представления на основе параметров URL.

До сих пор я понял, что мне нужно установить макет в контроллере. В моем контроллере под действием show у меня есть:

if params['iframe'] == 'true'
  render :layout => 'vendored'
end

Макет «vendored» существует в представлениях/макетах. Я получаю ужасный рендеринг несколько раз. Вот остальная часть действия show в моем контроллере:

 def show
    @event = Event.find(params[:id])
    @user = current_user
    @approved_employers = current_user.get_employers_approving_event(@event) if user_signed_in?
    respond_with(@event)

Проблема в том, что я не вижу другого рендера. Я не вижу другого во всем контроллере. Конечно, где-то есть рендеринг, потому что он рендерит макет моего приложения по умолчанию, это вызывает проблему? Я прочитал в документации по рельсам, что я могу добавить

and return

до конца, и это должно решить проблему, но не уверен, куда это поместить, поскольку два рендера не рядом друг с другом. Я также не вижу никаких других redirect_to. Где я должен искать этот другой рендер? В этом проблема?


person Kevin Z    schedule 15.10.2013    source источник
comment
FWIW, response_with в конце концов вызывает render...   -  person Philip Hallstrom    schedule 15.10.2013


Ответы (2)


См. этот ответ. Для вашего случая:

  before_filter :set_layout, :only => [:show]

  private

  def set_layout
   self.class.layout ( params['iframe'] == 'true' ? 'vendored' :  'application')
  end
person tihom    schedule 15.10.2013
comment
Вроде должно работать. Хотя теперь я получаю: Не удалось отобразить макет: неопределенная локальная переменная или метод `vendored' for #‹EventsController:0x007ff937c8bd50› Пробовал это и с приложением, но получил ту же ошибку. Мне нужно сказать, где находится макет или что-то в этом роде? - person Kevin Z; 15.10.2013
comment
@KevinZ попробуйте использовать 'vendored' вместо символа, также необходимо установить макет по умолчанию, если это не так. - person tihom; 15.10.2013

В качестве альтернативы, я думаю, что это легче понять:

class YourController < ApplicationController
  layout :iframe_layout

  private

  def iframe_layout
    params['iframe'] ? "vendored" : "application"
  end
end
person Jonathan Bender    schedule 15.10.2013