我想在rails gem的控制器中使用动态路径。
我已经添加了
module MyGem
class FooController < Config.controller
before_action ->{ append_view_path "app/views/my_gem/#{wizard_name}" }
...在视图中,我需要指定如下路径
app/views/my_gem/#{wizard_name}/my_gem/foo/some.erb在Rails中,是否以某种方式剪切gem命名空间的相对路径,并获得如下的查找路径?
app/views/my_gem/#{wizard_name}/some.erb
# or
foo/bar/some.erb谢谢!
更新:
我明白,在Engine中禁用isolate_namespace是有办法的,但我相信,这不是最好也是唯一的选择。
UPD2:对于Rails4来说,这个想法是非常有用的https://coderwall.com/p/p_yelg/render-view-outside-of-a-controller-in-rails-4
发布于 2018-07-12 18:34:31
Devise gem有一种通过覆盖_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这能应用到你的用例中吗?
请参阅来源:
https://github.com/plataformatec/devise/blob/master/app/controllers/devise_controller.rb
发布于 2019-06-24 09:40:26
通常,您应该只覆盖来自gem的部分视图或函数,不要像这样从gem库加载,因为当部署到真实服务器时,会给您的调试和改进带来很多麻烦。
发布于 2017-01-31 16:08:44
例如,您可以创建读取任意文件的how render方法,解释ERB并将其呈现为HTML页面。
ERB.new(File.read(Rails.root.join('foo', bar', 'some.erb'))).result(binding)通过传递binding,模板将可以访问当前上下文中的所有变量。
有关更多详细信息,请参阅再培训局文档:http://apidock.com/ruby/ERB
https://stackoverflow.com/questions/40336777
复制相似问题