Хорошо. Просто идея: у вас может быть часть _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
Тогда вам не придется ничего вызывать в контроллерах.