rutas rails proyecto libro formularios crear ruby-on-rails ruby-on-rails-3 partial-views actionview actionviewhelper

ruby on rails - proyecto - ¿Cómo puedo agregar una ruta de vista a la búsqueda de representación parcial de Rails?



routes ruby on rails (1)

Ya hay algo integrado en los rieles que facilita este tipo de "temática" para ti. Se llama prepend_view_path .

http://api.rubyonrails.org/classes/ActionView/ViewPaths/ClassMethods.html#method-i-prepend_view_path

También hay append_view_path para agregar rutas al final de la pila de búsqueda.

Tengo este exitoso trabajo en producción:

class ApplicationController < ActionController::Base before_filter :prepend_view_paths def prepend_view_paths prepend_view_path "app/views/#{current_app_code}" end end

Ahora, cada controlador buscará primero en "views / app1" (o cualquiera que sea su nombre dinámico) para las vistas correspondientes a la acción que se está llamando.

También es lo suficientemente inteligente como para verificar todas las rutas definidas para el archivo que está buscando, por lo que regresa a la ubicación predeterminada si no se encuentra una.

Me gustaría tener la siguiente estructura de directorios:

views/ app1/ users/_user.html.erb users/index.html.erb app2/ users/index.html.erb shared/ users/_user.html.erb users/index.html.erb

En mi opinión, llamaría

# app1/users/index.html <%= render :partial => "user" %> # => /app1/users/_user.html.erb # app2/users/index.html <%= render :partial => "user" %> # => /shared/users/_user.html.erb

Básicamente, ¿cómo le digo a Rails que compruebe el directorio / app2 / users y luego el directorio compartido antes de que aumente el error de plantilla que falta?

Actualizar

File.exist? esto (como lo sugirió Senthil, usando File.exist?

Aquí está mi solución - comentarios y sugerencias de bienvenida

# application_helper.rb # Checks for a partial in views/[vertical] before checking in views/shared def partial_or_default(path_name, options={}, &block) path_components = path_name.split("/") file_name = path_components.pop vertical_file_path = File.join(vertical}, path_components, file_name) shared_file_path = File.join("shared", path_components, file_name) full_vertical_file_path = File.join("#{Rails.root}/app/views/", "_#{vertical_file_path}.html.erb") attempt_file_path = File.exist?(full_vertical_file_path) ? vertical_file_path : shared_file_path render({:partial => attempt_file_path}.merge(options), &block) end