2012-05-29 4 views
3

Я пишу приложение Ruby on Rails с контроллером, называемым «page_controller», который отвечает за отображение страниц пользователям. Существует 3 разных типа страниц, которые могут отображаться, и в каждом случае на заднем конце должны быть разные вещи, поэтому я решил разбить функциональность на 3 метода в контроллере. Когда пользователь запрашивает страницу, вызывается метод «show», который определяет, принадлежит ли страница: 1. Принадлежит пользователю 2. Принадлежит другому пользователю и может быть просмотрен пользователем, запрашивающим его. 3. Принадлежит другому пользователю и не может быть просмотрен пользователем, запрашивающим его (неавторизованный)Методы вызова, которые визуализируют представления условно в контроллере Rails

Затем для вызова страницы вызывается соответствующий метод. Код выглядит примерно так:

def show 
    if (something) 
     showMine 

    elsif (something else) 
     showAnother 
    else 
     showUnauthorized 
    end 
end 

def showUnauthorized 

    respond_to do |format| 
     format.html # showUnauthorized.html.erb 
    end 
end 

def showMine 

    respond_to do |format| 
     format.html # showMine.html.erb 
    end 
end 

def showAnother 

    respond_to do |format| 
     format.html # showAnother.html.erb 
    end 
end 

Я получаю шаблон отсутствует ошибку, потому что рельсы хотят, чтобы сделать вид, когда «шоу» называются, но я не хочу любые мнения быть вынесены, когда «шоу» является называется. Я просто хочу, чтобы «show» вызывал правильный метод оттуда, и отображалось соответствующее представление для этого метода (showMine, showAnother или showUnauthorized). Как я могу это сделать? Или я полностью об этом поменяю?

+0

Попробуйте использовать 'render 'my_custom_view'' внутри * showUnauthorized *, * showMine *, * showAnother * методы. Если это не работает, укажите 'render: nothing => true' в' show'. Я также предлагаю объявить специальные методы частными (ничего общего с вашей проблемой). –

ответ

2

Вам необходимо объявить эти новые действия, которые вы создали в файле маршрутов, поскольку они не принадлежат маршрутам RESTful.
я sugest держать только шоу действия в контроллере и создать МСФ в представлении шоу, используя метод, включив в него парциальные (_showMine.html.erb, showAnother.html.erb, showUnauthorized)

пример визуализации:

вид шоу:

if (something) 
    <%= render 'showMine' %> 
elsif (something else) 
    <%= render 'showAnother' %> 
else 
    <%= render 'showUnauthorized' %> 
end 

Я надеюсь, что это помогает ...

+0

Оба ответа хороши, но я думаю, что я пойду с таким подходом, так как это просто швы чище. – Andrew

2

Я в принципе согласен с комментарием Samy, но вот некоторые фон:

Метод, который сообщает Rails, какой вид использовать - render. Если вызов метода не используется в вашем методе show, Rails предполагает, что у вас есть вид, называемый show.xxx.xxx, например. show.html.erb, который должен быть визуализирован. Обратите внимание, что он не предполагает, что шаблон будет иметь префикс show, потому что это имя метода. Предполагается, что это будет show, потому что это имя действия . Название действия передается контроллеру как часть запроса; это не просто производное от имени любого метода, в котором есть блок respond_to.

Все respond_to блоки сделать, это указать различные шаблоны представлений, основанных на MIME тип запроса, но так как вы никогда не называйте render, все эти дополнительные методы все еще пытаются вызвать show вид (show.html.erb в каждом конкретном случае), потому что вы никогда не сообщали Rails render о любом другом представлении, а название действия - show.

Итак, вместо блоков response_to просто позвоните render [some_view] в каждый из ваших других методов.

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

http://ryanbigg.com/2009/04/how-rails-works-2-mime-types-respond_to/

Он описывает то, что respond_to делает, в частности, как это клавиша выключает имя действия, чтобы определить, какой вид визуализировать.