2012-08-16 4 views
3

У меня есть контроллер Rails, чьи действия имеют общий вид. Вместо того, чтобы дублировать код в нескольких разных представлениях, я хотел бы, чтобы все действия делились одним и тем же представлением (и, возможно, даже с другими контроллерами).Rails несколько действий совместно используют один вид

Я понимаю, что это может быть достигнуто путем добавления вызова для каждого действия и указания ему использовать один и тот же файл вида, но есть ли способ, которым я могу связать это с группой действий и избегать явного внутри каждого из них ?

+0

Похоже, вы должны использовать before_filters. Ваш вариант использования идеально подходит. Затем вы будете использовать макеты, как сказал Робин. – Max

+0

Я не вижу, как before_filters помогают мне с рендерингом –

ответ

2

Не могли бы вы объяснить, почему макеты не работают? Я считаю, что этот код должен решить вашу проблему.

Предположим, у вас есть UsersController, и вы хотите, чтобы все действия, кроме новых, и создавались для использования одних и тех же представлений. Тогда вы можете легко:

def UsersController < ApplicationController 
    layout "shared_layout", except: [:new, :create] 
    layout "new_user_layout", only: [:new, :create] 

    def show 
    # Renders in app/views/layouts/shared_layout.html.erb 
    end 

    def index 
    # Renders in app/views/layouts/shared_layout.html.erb 
    end 

    def new 
    # Renders in app/views/layouts/new_user_layout.html.erb 
    end 

    def create 
    # Renders in app/views/layouts/new_user_layout.html.erb 
    end 
end 

Затем вы можете создать макет, который говорит, что нужно визуализировать в совместно используемом. В app/views/layouts/shared_layout.html.erb

Это будет оказывать партиалы 1, 2 и 3 таким же образом для всех действий контроллера. Что не так с этим?

+0

I предположим, что он хотел избежать дублирования кода из своего макета приложения (раздел главы, нижний колонтитул и т. д.), но с частичными, он становится легко управляемым, и я не знаю, как лучше это сделать. – Robin

+0

Хорошо, поэтому я пересмотрел это, и он по-прежнему ищет файл шаблонов действий. То есть, загрузка/users/index по-прежнему ищет views/users/index.html.erb, который, если я разделяю все эти взгляды, не существует. Есть предположения? –

0

У вас есть несколько решений:

Вы можете создать макет в views/layout специально для этих действий.

Вы бы затем установить макет в контроллере:

class LalasController < ApplicationController 
    layout "your_action_layout" 
end 

Вы могли бы говорить об этом, когда вы упоминая render ..., но вы можете создать мини-макеты из обертонов:

В views/controller_names/my_layout

<div class="my-layout"> 
    <%= yield %> 
</div> 

И затем, в ea ch ваших действий, вы бы сделали:

<%= render layout: "my_layout" do %> 
    <div></div> <!-- All the code of your view --> 
<% end %> 
+0

Это то, что я не хочу быть явным во всех своих действиях, как в последнем примере. Я пытаюсь избежать этого. Я также предпочел бы избежать маршрута макета, потому что это означает, что мне нужно повторить весь контент внутри моего 'application.html.erb' –

+0

Ну, если вы разделите макет приложения на частичные, это не должно быть большой проблемой иметь другой макет. Извините, но у меня нет другого решения. – Robin

+0

Да, это просто не идея. Честно говоря, я не думал, что есть другое решение для этого (вот почему я его попросил). Я буду продержаться за любые другие ответы и по умолчанию вернуться к этому, если нет. Большое спасибо за ваше время –

Смежные вопросы