2016-10-31 18 views
18

Tôi muốn sử dụng đường dẫn động trong bộ điều khiển của tôi trong đường ray gem.Rails 4 + append_view_path

tôi đã thêm vào

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

và trong quan điểm tôi cần phải xác định con đường như

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

là trong Rails một cách nào đó, để cắt đường dẫn tương đối của không gian tên đá quý, và nhận được tra cứu con đường như thế nào?

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

Cảm ơn bạn!

UPD:

Tôi hiểu, rằng không có cách với việc vô hiệu hóa isolate_namespace trong Engine, nhưng tôi tin rằng, đó không phải là tốt nhất và duy nhất tùy chọn.

UPD2: Đối với Rails4 ý tưởng này là rất hữu ích https://coderwall.com/p/p_yelg/render-view-outside-of-a-controller-in-rails-4

+3

Tôi gặp khó khăn khi hiểu chính xác những gì bạn muốn. Bạn có thể đưa ra một ví dụ về quan điểm của bạn không? –

+0

xem nội dung không quan trọng trong câu hỏi này, câu hỏi chỉ là về đường dẫn tra cứu lượt xem. –

+0

Vì vậy, 'view_paths' của bạn trông như thế nào, nó trông như thế nào, và nó trông như thế nào sau khi sử dụng' isolate_namespace'? –

Trả lời

0

Bạn có thể làm cho bạn cách làm cho phương pháp mà đọc một tập tin tùy ý, giải thích các ERB và làm cho nó như một trang HTML ví dụ.

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

Bằng cách chuyển binding, mẫu sẽ có quyền truy cập vào tất cả các biến trong ngữ cảnh hiện tại.

docs Xem ERB để biết thêm chi tiết: http://apidock.com/ruby/ERB

0

Giả đá quý của bạn là một công cụ, bạn sẽ có thể chỉ cần gọi render :some trong động cơ. Nếu ứng dụng có chế độ xem được gọi là <gem_name>/<controller_name>/some.html.erb, ứng dụng sẽ được sử dụng.

Ngoài ra, bạn có thể cung cấp phiên bản của chế độ xem đó trong đá quý sẽ được sử dụng nếu ứng dụng chưa cung cấp.

Nếu bạn cần số wizard_name cũng được tra cứu, tôi nghĩ cách tốt nhất để làm điều đó là di chuyển phần đó của đường dẫn xem đến cuối mà bạn đang gọi hiển thị.

Vì vậy, trong bộ điều khiển đá quý của bạn, bạn sẽ viết render "#{wizard_name}/some" và nó sẽ tìm kiếm rằng cả hai trong ứng dụng của chúng tôi app/views/<gem_name>/<controller_name>/<wizard_name>/some.html.erb và trong đá quý của bạn app/views/<controller_name>/<wizard_name>/some.html.erb.