tutorial rails que ejemplos curso caracteristicas ruby-on-rails ruby ruby-on-rails-4

ruby on rails - que - Rails 4+append_view_path



ruby on rails tutorial (3)

Quiero usar la ruta dinámica en mi controlador en la gema de rieles.

He añadido a

module MyGem class FooController < Config.controller before_action ->{ append_view_path "app/views/my_gem/#{wizard_name}" } ...

y en vistas tengo que especificar la ruta como

app/views/my_gem/#{wizard_name}/my_gem/foo/some.erb

está en Rails de alguna manera, para cortar la ruta relativa del espacio de nombres de gemas, y obtener la ruta de búsqueda como?

app/views/my_gem/#{wizard_name}/some.erb # or foo/bar/some.erb

¡Gracias!

UPD:

Entiendo que hay una manera de deshabilitar isolate_namespace en Engine , pero creo que no es la mejor y la única opción.

UPD2: para Rails4 esta idea fue muy útil https://coderwall.com/p/p_yelg/render-view-outside-of-a-controller-in-rails-4


La gema Devise tiene una forma de agregar vistas a la ruta de acceso al reemplazar el método _prefixes:

class DeviseController < Devise.parent_controller.constantize include Devise::Controllers::ScopedViews # Override prefixes to consider the scoped view. # Notice we need to check for the request due to a bug in # Action Controller tests that forces _prefixes to be # loaded before even having a request object. # # This method should be public as it is is in ActionPack # itself. Changing its visibility may break other gems. def _prefixes #:nodoc: @_prefixes ||= if self.class.scoped_views? && request && devise_mapping ["#{devise_mapping.scoped_path}/#{controller_name}"] + super else super end end end

¿Se puede aplicar esto a su caso de uso?

Ver fuente:
https://github.com/plataformatec/devise/blob/master/app/controllers/devise_controller.rb


Podrías hacer tu método de renderizado que lee un archivo arbitrario, interpretar el ERB y representarlo como una página HTML, por ejemplo.

ERB.new(File.read(Rails.root.join(''foo'', bar'', ''some.erb''))).result(binding)

Al pasar el binding , la plantilla tendrá acceso a todas las variables en el contexto actual.

Consulte la documentación de ERB para obtener más detalles: http://apidock.com/ruby/ERB


Suponiendo que tu gema es un motor, deberías poder simplemente llamar render :some en el motor. Si la aplicación tiene una vista llamada <gem_name>/<controller_name>/some.html.erb , se utilizará.

Además, puede proporcionar una versión de esa vista en su gema que se utilizará si la aplicación aún no proporciona una.

Si necesita wizard_name también el wizard_name del wizard_name , creo que la mejor manera de hacerlo sería mover esa parte de la ruta de la vista al final al que está llamando render.

Entonces, en el controlador de tu gema, escribirías render "#{wizard_name}/some" y buscarías esa vista en la app/views/<gem_name>/<controller_name>/<wizard_name>/some.html.erb y en la app/views/<controller_name>/<wizard_name>/some.html.erb tu gema app/views/<controller_name>/<wizard_name>/some.html.erb .