문제

두 개 또는 세 개의 주요 "섹션"이 있는 Ruby/Rails 앱이 있습니다.사용자가 해당 섹션을 방문하면 일부 하위 탐색을 표시하고 싶습니다.세 섹션 모두 동일한 레이아웃을 사용하므로 레이아웃에 대한 탐색을 "하드 코딩"할 수 없습니다.

이를 수행하기 위한 몇 가지 다른 방법을 생각해 볼 수 있습니다.사람들의 투표를 돕기 위해 답변으로 넣을 것 같습니다.

다른 아이디어가 있나요?아니면 무엇에 투표하나요?

도움이 되었습니까?

해결책

각 섹션에 자체 컨트롤러가 있다고 가정하면 부분을 사용하여 쉽게 수행 할 수 있습니다.

세 부분이라는 섹션이 있다고 가정 해 봅시다 게시물, 사용자 그리고 관리자, 각각 자체 컨트롤러가 있습니다. 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

이 각 Subnav 부분에서 해당 섹션과 관련된 옵션을 선언합니다. /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>

마지막으로,이 작업을 마치면 레이아웃에 Subnav 부분을 포함하면됩니다.

<div id="header">...</div>    
<%= render :partial => "subnav" %>
<div id="content"><%= yield %></div>
<div id="footer">...</div>

다른 팁

  1. 부분 렌더링. 이것은 아마도 레이아웃이 IF 문을 가지고 있거나 도우미에게 전달하는 것을 제외하고 도우미 방법과 매우 유사합니다 ...

하위 메뉴의 내용은 각 컨트롤러에서 선언적으로 갈 수 있습니다.

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를 호출 할 때마다 특정 컨트롤러에 반복 할 수있는 올바른 목록이 있습니다.

이로 인해이 논리를 뷰 템플릿 내부에 넣는 것보다 깨끗한 솔루션으로 나옵니다.

ApplicationController 내부의 기본값 (빈?) 메뉴를 선언 할 수도 있습니다.

경고 : 앞으로의 고급 트릭!

그들 모두를 렌더링하십시오. CSS/JavaScript를 사용하지 않아도되는 것을 숨 깁니다. 이는 여러 가지 방법으로 사소하게 초기화 할 수 있습니다. (JavaScript는 사용 된 URL, 쿼리 매개 변수, 쿠키 등의 무언가를 읽을 수 있습니다.) 이것은 캐시에서 훨씬 더 잘 재생할 수있는 이점이 있습니다 (왜 세 뷰를 캐시한 다음, 캐시를 캐시 할 수있을 때 동시에 만료 해야하는 이유 ?), 더 나은 사용자 경험을 제공하는 데 사용할 수 있습니다.

예를 들어, 하위 탐색과 함께 공통 탭 막대 인터페이스가 있다고 가정 해 봅시다. 세 탭의 내용을 모두 렌더링하고 (즉, HTML로 작성된) 두 탭을 숨기면 두 탭 사이를 전환하는 것은 사소한 자바 스크립트이며 서버조차도 누르지 않습니다. 큰 승리! 사용자의 대기 시간이 없습니다. 서버로드가 없습니다.

원하다 또 다른 큰 승리? 이 기술의 변형을 사용하여 사용자에게는 99% 외에도 99%가 될 수 있지만 여전히 사용자 상태를 포함하는 페이지를 속일 수 있습니다. 예를 들어, 로그인 할 때 "hiya bob"이라고 말하지만 "hiya bob"이라고 말하는 사이트의 첫 페이지가있을 수 있습니다. 페이지의 해당 부분을 쿠키를 읽는 JavaScript를 통해 읽으십시오. 전체 페이지를 캐시하십시오 로그인 상태에 관계없이 모든 사용자 페이지 캐싱에서. 이는 문자 그대로 일부 사이트에서 전체 레일 스택에서 액세스의 70%를 슬라이싱 할 수 있습니다.

당신의 사이트가 실제로 새로운 HTML 페이지로 정적 자산을 제공하는 Nginx 일 때 레일이 확장 될 수 있는지 여부는 누가 새로운 HTML 페이지를 제공하는 경우 가끔씩 수천 명의 액세스마다 실행되는 일부 루비가 배송하는 사람;)

내비게이션 플러그인과 같은 것을 사용할 수 있습니다 http://rpheath.com/posts/309-rails-plugin-navigation-helper

하위 섹션 내비게이션은 상자 밖으로 내비게이션을 수행하지 않지만 약간 조정하면 비슷한 일을하도록 설정할 수 있습니다.

부분 부분을 사용하는 것이 좋습니다.당신이 그것에 대해 갈 수 있는 몇 가지 방법이 있습니다.특정 변수가 필요하다는 점에서 약간 까다로운 부분을 만들 때 이에 대한 도우미 메서드도 만듭니다.

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 내부에 있을 수도 있습니다.

나는 거의 같은 질문을했다. 조언이 필요합니다 : 하위 메뉴를위한 레일 조회수 구조? 최상의 솔루션은 아마도 부분을 사용하는 것이 었습니다.

이 작업을 수행하는 또 다른 가능한 방법이 있습니다 : 중첩 레이아웃

이 코드를 어디에서 찾았는지 기억이 나지 않으므로 원래 저자에게 사과드립니다.

lib 폴더에서 nested_layouts.rb라는 파일을 만들고 다음 코드를 포함하십시오.

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'가있는 곳에 응용 프로그램 레이아웃 내부에 렌더링됩니다.

이 방법은 사이트의 설계와 다양한 요소가 어떻게 구성되는지에 따라 실제로 잘 작동 할 수 있습니다. 예를 들어, 포함 된 레이아웃 중 하나에는 특정 동작에 표시되어야하는 컨텐츠를 포함하는 일련의 DIV 만 포함 할 수 있으며, 더 높은 레이아웃의 CSS는 위치가 위치하는 위치를 제어 할 수 있습니다.

이 문제에 대한 접근 방식은 거의 없습니다.

각 섹션마다 다른 레이아웃을 사용하고 싶을 수도 있습니다.

주어진 디렉토리의 모든 뷰에 포함 된 부분을 사용할 수 있습니다.

사용하고 싶을 수도 있습니다 content_for 그것은보기 나 부분으로 채워져 있으며, 당신이있는 경우 글로벌 레이아웃에서 호출됩니다.

개인적으로 나는이 경우 더 많은 추상화를 피해야한다고 생각합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top