2016-10-31 27 views
18

我想在rails gem中的控制器中使用動態路徑。Rails 4 + append_view_path

我已經加入到

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的某種方式,切割的寶石命名空間的相對路徑,並獲得查詢路徑像?

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

謝謝!

UPD:

我明白,有一個在Engine禁用isolate_namespace方式,但我相信,這是不是最好的和唯一的選擇。

UPD2:對於Rails4這個想法是https://coderwall.com/p/p_yelg/render-view-outside-of-a-controller-in-rails-4

+3

我無法準確理解你想要什麼。你能舉一個你的觀點的例子嗎? –

+0

查看內容在這個問題並不重要,問題只是關於查看查找路徑。 –

+0

那麼,你的'view_paths'看起來是什麼樣子,它應該是什麼樣子的,它在使用'isolate_namespace'之後是怎麼樣的? –

回答

0

你可以做非常有用的你如何渲染方法讀取任意文件,解釋該局並使其作爲例如HTML頁面。

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

通過傳遞binding,模板將有機會獲得所有的變量在目前情況下。

查看ERB文檔的更多細節:http://apidock.com/ruby/ERB

0

假設你的寶石是一個引擎,你應該能夠簡單地調用render :some發動機。如果該應用有一個名爲<gem_name>/<controller_name>/some.html.erb的視圖,它將被使用。

此外,您可以在您的寶石中提供該視圖的一個版本,如果該應用程序尚未提供該版本,將會使用該版本。

如果您還需要查找wizard_name,我認爲最好的方法是將視圖路徑的那部分移動到您要調用渲染的那一端。

因此,在您的寶石控制器中,您將編寫render "#{wizard_name}/some",它會在我們的應用程序的app/views/<gem_name>/<controller_name>/<wizard_name>/some.html.erb和您的寶石的app/views/<controller_name>/<wizard_name>/some.html.erb中查找該視圖。