pan rallado fáciles para la aplicación de los carriles REST
-
23-08-2019 - |
Pregunta
¿Hay algún método de ayuda (Aparte predeterminado carriles de migas de pan ) que genera el pan navegación miga de forma dinámica para una página en particular sin tener que pasar parámetros triviales en la aplicación REST? Es decir, algo que se da cuenta de forma automática cuando el usuario se basa en la url REST ella está visitando?
Para la aplicación antes mencionada, tenemos que pasar parámetros como
RESTO
<% add_crumb(‘Profile’, user_profile_path) %>
Página actual
<% add_crumb(“My Incoming Messages”, request.path) %>
Tiene que haber una manera de generalizar el código de modo que no se requiere ningún paso de parámetros y debería funcionar para todas las aplicaciones RESTful con una configuración mínima.
Solución
Se desarrolló un simple truco. El método, sin embargo asume que existe un 'nombre' método para cada objeto del modelo correspondiente a cada recurso en la url REST. Sea lo que devuelve el método 'nombre' se muestra como nombre de ruta de navegación. Si no se encuentra, se muestra como es, sin por lo que es enlazar a nada. Separador utilizado es '->'. Usted puede cambiar para adaptarse a su requisito
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
El método acepta generalmente request.url (lo cual dado el URL de la página actual) como parámetro. El método acepta la url a propósito para fines de personalización. Para generar la ruta de exploración, sólo tiene que añadir siguiente código en su opinión -
<%= get_bread_crumb(request.url) %>
Para el /ideabox/2/idea/1
url, la miga de pan se parece a
texto alternativo http://www.imagechicken.com/uploads/1234855404069992300.png
Perdone si la calidad del código no es tan grande. Estoy seguro de que este código puede ser re-factorizar pero también estoy seguro de que sería capaz de hacer eso antes de usarlo.
Gracias.
Otros consejos
La solución proporcionada por chirantan es grande. Si necesita breabcrumbs para el controlador de espacio de nombres y la necesidad de cambiar el pan rallado, dependiendo del espacio de nombres, así entonces prueba este. Esto no es perfecta, pero refactorearlo como sea necesario. Funciona para mi proyecto.
Definir un nuevo ayudante: 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
A continuación, definir una vista para este _navigation.haml
ayudante
- 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]