3

RESTfulアプリケーションで些細なパラメータを渡すことなく、特定のページのパンくずナビゲーションを動的に生成するヘルパーメソッド(デフォルトのレールブレッドクラム以外)はありますか? つまり、ユーザーがアクセスしている REST URL に基づいて、ユーザーがどこにいるかを自動的に把握するものですか?

上記の実装では、次のようなパラメーターを渡す必要があります

休み

<% add_crumb(‘Profile’, user_profile_path) %>

現在のページ

<% add_crumb(“My Incoming Messages”, request.path) %>

パラメーターを渡す必要がなく、最小限の構成ですべての RESTful アプリで機能するように、コードを一般化する方法が必要です。

4

2 に答える 2

5

簡単なハックを開発しました。ただし、このメソッドは、RESTful URL の各リソースに対応するすべてのモデル オブジェクトにメソッド「name」が存在することを前提としています。メソッド「name」が返すものは何でも、ブレッドクラム名として表示されます。見つからない場合は、何もリンクさせずにそのまま表示します。使用されるセパレーターは「->」です。要件に合わせて変更できます。

def get_bread_crumb(url)
  begin
    breadcrumb = ''
    sofar = '/'
    elements = url.split('/')
    for i in 1...elements.size
      sofar += elements[i] + '/'
      if i%2 == 0
        begin
          breadcrumb += "<a href='#{sofar}'>"  + eval("#{elements[i - 1].singularize.camelize}.find(#{elements[i]}).name").to_s + '</a>'
        rescue
          breadcrumb += elements[i]
        end
      else
        breadcrumb += "<a href='#{sofar}'>#{elements[i].pluralize}</a>"
      end
      breadcrumb += ' -> ' if i != elements.size - 1
    end
    breadcrumb
  rescue
    'Not available'
  end
end

このメソッドは通常、request.url (現在のページの指定された URL) をパラメーターとして受け入れます。このメソッドは、カスタマイズ目的で意図的に URL を受け入れます。ブレッドクラムを生成するには、ビューに次のコードを追加するだけです -

<%= get_bread_crumb(request.url) %>

url/ideabox/2/idea/1の場合、パンくずは次のようになります

代替テキスト http://www.imagechicken.com/uploads/1234855404069992300.png

コードの品質がそれほど高くない場合はすみません。このコードはリファクタリングできると確信していますが、使用する前にリファクタリングできると確信しています。

ありがとう。

于 2009-02-17T06:20:36.687 に答える
0

Chirantan が提供するソリューションは素晴らしいです。名前空間付きコントローラーの階層リンクが必要で、名前空間に応じて階層リンクを変更する必要がある場合は、これを試してください。これは完璧ではありませんが、必要に応じてリファクタリングしてください。それは私のプロジェクトで機能します。

新しいヘルパーを定義します。navigation_helper.rb

module NavigationHelper

  def navigation_add(title, url, namespace)

    if defined? @@namespace and !@@namespace.nil? and @@namespace == namespace
      @@navigation ||= []
    else
      @@navigation = []
    end

    @@navigation << {title: title, url: url} unless title == "Home"

    new_nav = []
    @@navigation.each do |hash|
      new_nav.push hash
      if hash[:title].to_s == title.to_s
        break
      end
    end

    @@navigation = new_nav
    @@navigation.uniq!
    @@namespace = namespace
  end

  def render_navigation
    if (request.path_parameters[:controller].sub('/', '::_').camelize + 'Controller').classify.constantize.action_methods.to_a.include? 'index'
      navigation_add controller_name.camelize.to_s, request.path_parameters.merge({action: 'index'}).except(:id), params[:controller].include?('/') ? params[:controller].split("/").first : nil
    end
    if defined? @@navigation
      render partial: 'navigation/navigation', locals: { navs: @@navigation, namespace: @@namespace }
    else
      render text: ''
    end
  end
end

次に、このヘルパーのビューを定義します_navigation.haml

- unless navs.blank?

  %ol.breadcrumb

    - navs.each_with_index do |nav, index|

      - if index == 0

        %li=link_to fa_icon('arrow-left', text: 'Go Back'), :back

        - unless namespace.nil?

          %li

            %h4.inline= request.fullpath.split('/')[1].gsub('-', '_').camelize

            = fa_icon('angle-double-right')

      %li= link_to_unless (nav[:title] == controller_name.camelize and action_name == 'index'),  fa_icon(nav[:title].downcase.singularize, text: nav[:title]), nav[:url]
于 2014-07-17T00:53:25.303 に答える