Как сделать частички боковой панели и передать ей объекты? - Рельсы 3.1 - PullRequest
2 голосов
/ 17 ноября 2011

У меня есть макет с общими элементами на боковой панели на страницу (некоторые элементы являются общими для большинства страниц, некоторые уникальны для некоторых страниц).

--------------------------------
|                   | side box |
|                   |          |
|                   |__________|
|                   | side box |
|                   |          |
|                   |__________|
|                   | side box |
|                   |          |
|                   |          |
--------------------------------

Прямо сейчас, как я это делаю, включаю shared/sidebar_type частичное из представлений. Часть sidebar дополнительно включает в себя отдельные части окна, которые должен отображать тип страницы.

1) Каков наилучший способ сегментировать и включать эти частичные элементы и настраивать, какие поля содержимого отображаются на боковой странице на каждой странице?

2) Лучшая практика для установки объектов и передачи их в эти части (боковые панели) для вывода

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

Я новичок в Rails из мира PHP, и правильная организация этих общих паролей немного сбивает с толку. То, как я сейчас передаю объекты этим частям ящика, кажется недооцененным.

Ответы [ 2 ]

2 голосов
/ 17 ноября 2011

Хорошо. Просто идея: у вас может быть часть _side_bar, которая, в свою очередь, включает в себя все части _side_box, определенные в массиве, инициализированном в методе контроллера. Таким образом, вы можете получить что-то вроде этого:

Контроллер:

...
def some_method
    @side_boxes = ["side_box_1", "side_box_2", "side_box_3"]
    ...
end
...

some_method.html.erb (или в layouts / application.html.erb, если вы хотите его на всех страницах):

...
<%= render :partial => 'shared/side_bar' %>
...

_side_bar.html.erb:

...
<% @side_boxes.each do |partial_name| %>
    <%= render :partial => "shared/#{parial_name}" %>
<% end %>
...

Тогда вам понадобится _side_box_1.html.erb, _side_box_2.html.erb и т. Д. ...

Чтобы ответить на вторую часть вашего вопроса: если вы хотите передать аргументы частичному, вы можете задать параметр hash: locals для функции render. Вот так:

<%= render :partial => 'foo/bar', :locals => {:arg_1 => "argument1", :arg_2 => "argument2"} %>

Затем вы можете использовать эти параметры в частичном _bar.html.erb, как локальные переменные:

<%= arg_1 + " " + arg_2 %>
#=> argument1 argument2

Надеюсь, это поможет!

EDIT

Если боковые панели будут отображаться по всему сайту, вы можете захотеть иметь метод get_side_boxes в вашем ApplicationHelper (app / helpers / application_helper.rb). Таким образом, вы просто помещаете это в свой файл layout / application.html.erb:

<% @side_boxes = get_side_boxes %>

и он будет вызываться каждый раз при загрузке страницы. Затем в вашем ApplicationHelper вам нужно будет определить поведение этой функции, чтобы она получала side_boxes для конкретного действия контроллера, которое вы отображаете. Это было бы что-то вроде этого:

ApplicationHelper

def get_side_boxes
   action = params[:action]
   controller = params[:controller]
   model = controller.classify #This will return the class name corresponding to that controller
   model.constantize.get_side_boxes(action) #This will return whatever the CurrentModelName.get_side_boxes returns
end

Затем в каждой модели (или, по крайней мере, в тех, которые имеют контроллеры, которые отображают side_boxes), вам нужно будет реализовать метод get_side_boxes, который возвращает соответствующий массив частичных имен в зависимости от действия, которое ему передано. Что-то вроде

SomeModel

def self.get_side_boxes(action)
    side_boxes = Array.new
    case action
        when "index"
            side_boxes = ["side_box_1", "side_box_2"]
        when "new"
            side_boxes = ["side_box_3"]
        when "edit"
            ...
        ...
    end
    side_boxes
end

Тогда вам не придется ничего вызывать в контроллерах.

1 голос
/ 17 ноября 2011

Я собираюсь сделать что-то подобное в моем собственном приложении прямо сейчас, но пришел сюда, чтобы сначала немного отложить.Я собираюсь использовать Cells для создания боковых панелей.И мне также понадобится некоторая логика, чтобы ячейка Последние новости не появлялась в индексе новостей или чтобы ячейка Последние изображения не появлялась на странице изображений и т. Д. Я опубликую своюрезультаты позже, но что-то вроде этого сделает это:

- ["videos", "podcasts", "news", "mixes"].each do |cell|
  = render_cell cell, :recent unless controller.controller_name == cell
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...