Как я реализую Определенную для раздела навигацию в Ruby on Rails?

Если вы хотите изменить значение в вызове метода в анонимном классе, это «значение» на самом деле является URL. Итак, если вы используете Guava, вы можете написать

HTML5
12
задан GEOCHET 29 September 2008 в 22:49
поделиться

9 ответов

Можно легко сделать это использование partials, предположив, что каждый раздел имеет свой собственный контроллер.

Скажем, у Вас есть три раздела под названием Сообщения, Пользователи и Администратор, каждый со своим собственным контроллером: PostsController, UsersController и AdminController.

В каждом соответствии views каталог, Вы объявляете a _subnav.html.erb неравнодушный:

/app/views/users/_subnav.html.erb
/app/views/posts/_subnav.html.erb
/app/views/admin/_subnav.html.erb

В каждом из этих подвоенно-морских partials Вы объявляете опции, характерные для того раздела, таким образом, /users/_subnav.html.erb мог бы содержать:

<ul id="subnav">
  <li><%= link_to 'All Users', users_path %></li>
  <li><%= link_to 'New User', new_user_path %></li>
</ul>

Пока /posts/_subnav.html.erb мог бы содержать:

<ul id="subnav">
  <li><%= link_to 'All Posts', posts_path %></li>
  <li><%= link_to 'New Post', new_post_path %></li>
</ul>

Наконец, после того как Вы сделали это, просто необходимо включать подвоенно-морское частичное в расположение:

<div id="header">...</div>    
<%= render :partial => "subnav" %>
<div id="content"><%= yield %></div>
<div id="footer">...</div>
9
ответ дан 2 December 2019 в 05:05
поделиться
  1. Частичный рендеринг. Это очень похоже на вспомогательный метод кроме, возможно, расположения, имел бы некоторых, если операторы, или выдают это помощнику...
7
ответ дан 2 December 2019 в 05:05
поделиться

Что касается содержания Ваших подменю, можно пойти в нем декларативным способом в каждом контроллере.

class PostsController < ApplicationController
#...
protected
  helper_method :menu_items
  def menu_items
    [
      ['Submenu 1', url_for(me)],
      ['Submenu 2', url_for(you)]
    ]
  end
end

Теперь каждый раз, когда Вы называете menu_items от представления, у Вас будет правильный список для итерации для определенного контроллера.

Это кажется мне более чистым решением, чем помещение этой логики в шаблонах представления.

Обратите внимание, что можно также хотеть объявить значение по умолчанию (пустой?) menu_items в ApplicationController также.

7
ответ дан 2 December 2019 в 05:05
поделиться

Предупреждение: Усовершенствованные Приемы вперед!

Представьте их всех. Скройте тех, что Вам не нужно использование CSS/Javascript, который может быть тривиально инициализирован в любом количестве путей. (JavaScript может считать используемый URL, параметры запроса, что-то в cookie, и т.д. и т.д.), это имеет преимущество потенциального проигрывания намного лучше с Вашим кэшем (почему кэш, три представления и затем должны истечь их всех одновременно, когда можно кэшировать тот?), и может использоваться для представления лучшего пользовательского опыта.

Например, давайте притворимся, что у Вас есть общий интерфейс панели вкладок с sub навигацией. Если Вы представляете содержание всех трех вкладок (т.е. его записанный в HTML) и скрываете двух из них, переключение между двумя вкладками является тривиальным JavaScript и даже не поражает Ваш сервер. Большая победа! Никакая задержка для пользователя. Никакая загрузка сервера для Вас.

Хотите другую большую победу? Можно использовать вариацию на эту технику для обмана на страницах, которые могли бы, но 99%, распространенных через пользователей, но все еще, содержат пользовательское состояние. Например, у Вас могла бы быть первая полоса сайта, который относительно распространен через всех пользователей, но говорит "Hiya Bob", когда они зарегистрированы. Поместите необщую часть ("Hiya, Bob") в cookie. Имейте ту часть страницы быть считанными на пути JavaScript, читая cookie. Кэшируйте всю страницу для всех пользователей независимо от состояния входа в систему в кэшировании страницы. Это буквально способно к отрезанию 70% доступов от всего стека Rails на некоторых сайтах.

Кто заботится, могут ли направляющие масштабироваться или не, когда Вашим сайтом является действительно Nginx, обслуживающий статические активы с новыми страницами HTML, иногда будучи поставленным некоторым Ruby, работающим на каждом тысячном доступе или так ;)

3
ответ дан 2 December 2019 в 05:05
поделиться

Вы могли использовать что-то как плагин навигации по http://rpheath.com/posts/309-rails-plugin-navigation-helper

Это не делает навигации подраздела из поля, но с небольшой тонкой настройкой Вас мог, вероятно, настроить его, чтобы сделать что-то подобное.

1
ответ дан 2 December 2019 в 05:05
поделиться

Я задал в значительной степени тот же вопрос сам: совет Потребности: Структура направляющих просматривает для подменю? Лучшее решение состояло в том, чтобы, вероятно, использовать partials.

1
ответ дан 2 December 2019 в 05:05
поделиться

Существует другой возможный способ сделать это: Вложенные Разметки

я не помню, где я нашел этот код так извинения исходному автору.

создайте файл, названный nested_layouts.rb в Вашей папке lib, и включайте следующий код:

module NestedLayouts
  def render(options = nil, &block)
    if options
      if options[:layout].is_a?(Array)
        layouts = options.delete(:layout)
        options[:layout] = layouts.pop
        inner_layout = layouts.shift
        options[:text] = layouts.inject(render_to_string(options.merge({:layout=>inner_layout}))) do |output,layout|
          render_to_string(options.merge({:text => output, :layout => layout}))
        end
      end
    end
    super
  end
end

затем, создайте свои различные разметки в папке разметок, (например, 'admin.rhtml' и 'application.rhtml').

Теперь в Ваших контроллерах добавляют это только в классе:

include NestedLayouts

И наконец в конце Ваших действий делают это:

def show
  ...
  render :layout => ['admin','application']
end

порядок разметок в массиве важен. Администраторское расположение будет представлено в расположении приложения везде, где 'yeild'.

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

1
ответ дан 2 December 2019 в 05:05
поделиться

Я предлагаю, чтобы Вы использовали partials. Существует несколько путей, которыми можно пойти об этом. Когда я создаю partials, которые немного придирчивы в этом, им нужны определенные переменные, я также создаю вспомогательный метод для него.

module RenderHelper
  #options: a nested array of menu names and their corresponding url
  def render_submenu(menu_items=[[]])
    render :partial => 'shared/submenu', :locals => {:menu_items => menu_items}
  end
end

Теперь частичное имеет локальную переменную, названную menu_items, по которому можно выполнить итерации для создания подменю. Обратите внимание, что я предлагаю вложенный массив вместо хеша, потому что порядок хеша непредсказуем.

Обратите внимание, что логика, решающая, какие объекты должны быть отображены в меню, могла также быть внутри render_submenu, если это имеет больше смысла Вам.

1
ответ дан 2 December 2019 в 05:05
поделиться

Существует немного подходов к этой проблеме.

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

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

Вы могли бы хотеть использовать content_for это заполнено или представлением или частичным, и названный в глобальном расположении, если у Вас есть тот.

Лично я полагаю, что необходимо избежать большего количества абстракции в этом случае.

0
ответ дан 2 December 2019 в 05:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: