2013-03-12 5 views
1

У нас есть простое приложение, которое имеет горизонтальную компоновку (левая боковая панель и содержимое справа), с верхним и нижним колонтитулом. Поэтому, если вы нажмете на определенный объект с левой стороны, представление будет отображаться с правой стороны с панелью навигации в верхних и нижних колонтитулах. Макет фактически отображает контент на той же самой странице для любых действий в левой части, а содержимое левой стороны будет отличаться в зависимости от раздела, выбранного в заголовке. Как мы должны планировать маршруты в этих случаях, которые отличаются от основной навигации, где каждое действие отображается на другой странице.Как сделать горизонтальную компоновку страницы с несколькими кадрами

Мои маршруты выглядит следующим образом ..

resources :foos do 
    resources :foo_bars do 
    end 
    end 

мне нужно, чтобы показать все FOOS на левой стороне панели, и если пользователь выбирает foo он должен показать свойства foo и foo_bars в таблице на правой боковой панели. Как будет выглядеть взгляд на меня и как URL-адрес в браузере будет искать меня? У нас будет несколько вкладок наверху и на основе этого вы увидите foos или аналогичные объекты верхнего уровня

ответ

1

Маршруты остаются прежними. Вам нужно будет использовать ваши звонки.

1

Если ваш вопрос:

как мы должны идти о разработке маршрутов

Образом, у вас это просто отлично, если вы хотите использовать вложенные ресурсы, и в вашем случае это кажется логичной. http://guides.rubyonrails.org/routing.html#nested-resources

В настоящее время, Ваш URL будет выглядеть следующим образом: /foos/:foos_id/foo_bars/some_action

Позвольте мне переименовать их так, все больше смысла. Допустим, foos - это категории, а foo_bars - действия.

Лично я бы переопределил to_param в файле модели категорий.

to_param 
    #return a more readable attribute here 
    name 
end 

Таким образом, ваш URL будет более тесно связан с именами всех категорий в левой части страницы.

Так что теперь, если у вас есть запись в таблице категорий, которые имели название животного, ваш URL будет выглядеть следующим образом: /categories/animal/actions/some_action

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

Я бы применил один и тот же принцип к вложенному ресурсу, тогда весь ваш URL-адрес будет точно представлять, какая вкладка выбрана на странице. Если у вас была запись в действиях с именем «running», и у вас были правильные настройки, тогда вы могли бы выглядеть так, как ваш url: categories/animal/actions/running.

Вы можете поиграть со всеми параметрами в вашем файле маршрутов, а затем использовать rake routes в терминале, чтобы узнать, какие изменения и как будут выглядеть ваши URL-адреса, прежде чем вы даже коснетесь браузера.

Вот несколько дополнительных ресурсов для вас.

http://apidock.com/rails/ActiveRecord/Integration/to_param http://guides.rubyonrails.org/action_controller_overview.html

Надеется, что это помогает.

0

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

Для ваших мнений/Фоос, переписать index.html.erb как:

<%= render partial: "show_foos", locals: { foos: @foos, selected_foo: nil }%> 

И ваш show.html.erb как:

<%= render partial: "show_foos", locals: { foos: @foos, selected_foo: @foo }%> 

В вашем foos_controller.rb в шоу-метод вам необходимо получить как @foos, так и @foo, например:

@foos = Foo.all 
@foo = Foo.find(params[:id]) 

Теперь, к интересной части. Назад в каталог views/foos. Создайте частичное имя «_show_foos.erb» (тот, который мы назвали как из #index, так и из #show). Сделайте что-то вроде:

<table> 
    <tr> 
    <td> 
     <%= render partial: "show_foos_list", locals: { foos: foos, selected_foo: selected_foo }%> 
    </td> 
    <td> 
     <%= render partial: "show_foo_props", locals: { selected_foo: selected_foo }%> 
    </td> 
    </tr> 
</table> 

Пожалуйста, обратите внимание, что это чрезвычайно грубой & некрасиво пример, который создает таблицу с двумя столбцами: один для списка Фоос в левой «панели», а другой для отображения результатов для выбранного foos в правой панели. В реальной жизни используйте divs и styling. Кроме того, подумайте о том, чтобы направить макет туда, где он находится, в соответствующий файл макета, и использовать там именованные уроки. Но, как я уже сказал, головной убор - простой стол.

Теперь просто определите две части, упомянутые здесь. Во-первых, «_show_foos_list.erb», в котором перечислены foos слева. Предположим, что каждый Foo имеет 'название' атрибут, что-то вроде:

<% foos.each do |foo| %> 
    <%= link_to_unless selected_foo && (foo.id == selected_foo.id), foo.title, foo %><br /> 
<% end %> 

Во-вторых, Foo & foo_bars справа - "_show_foo_props.erb":

<% if selected_foo %> 
    # Here display the Foo attributes 
    <h2> Foo: <%= selected_foo.title %> </h2> 
    <% selected_foo.foo_bars.each do |foo_bar| %> 
    # Here display each FooBar that belongs to Foo 
    <h3>FooBar <%= foo_bar.title %></h3> 
    <%= foo_bar.description %> 
    <% end %> 
<% end %> 

Опять же, очень грубый пример. Замените «title», «description» на нужные наборы параметров, используйте частичные для отображения FooBars. Сделайте стиль с помощью CSS. Etc и т. Д., ... Рефтор, как вы считаете нужным.

Говоря о маршрутах. То, что вы получаете, это когда вы переходите на ваш «www.yourapp.com/foos», url - это список всех фосов слева, ничего справа. Как только вы нажмете на любом foo в левом столбце, перейдите к «www.yourapp.com/foos/:id», где: id - это идентификатор выбранного foo (и рассмотрите to_param из другого ответа здесь или более продвинутых методов чтобы сделать эту часть значимой) и получить список foos слева, а также свойства выбранного foo и всех foo_bars, принадлежащих ему справа.

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

0

Если я правильно понимаю ваш вопрос, ответы на Ajax требуются неверно. У меня есть древнее приложение Perl (написанное в 1999 году), которое делает это. В настоящее время я повторно внедряю Rails, и он работает нормально. Рамки делают его особенно простым, чтобы данные могли прокручиваться, пока меню остается фиксированным.

Вам нужно использовать фреймы HTML4, которые устарели в HTML5. Возможно использование IFRAME для фрейма рендеринга данных и совместимость с HTML5, но результат менее полезен, чем решение FRAME в HTML4, по крайней мере, с некоторые браузеры.

Как говорили другие, ваши маршруты в порядке.

Хитрость заключается в использовании поля target в form, чтобы направить ответ «Отправить» на кадр рендеринга. Мой код haml для «командного» кадра:

= form_tag admin_menu_path, :method => :put, :target => 'data_frame' do 
    ... 

Остальное - обычная форма. Эта форма остается постоянной (в моем случае) левым фреймом, а ответы заменяют друг друга вправо data_frame.

Совпадение рамка HTML является:

<frameset cols="360,*"> 
    <frame name="menu_frame" src="..."> 
    <frame name="data_frame" src="admin.htm"> 
</frameset> 

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

Я готов для комментариев, говоря, что рамки далеки от лучшей практики. Но для этого конкретного приложения они идеальны: простые, понятные и чрезвычайно браузер независимый. Например. мой 1999 Perl сгенерированный код отлично работал на IE 2.0 и Netscape (предок Firefox, друзей). И это все еще идеально подходит для каждого современного браузера, который я могу найти. Желание Ajax могло бы сказать то же самое ...

Если я неправильно понял ваш вопрос, я с радостью удалю этот ответ.