2013-08-06 29 views
5

Tôi đang sử dụng Rabl để tạo ra XML trong một nhiệm vụ rake:Rabl.render: cách sử dụng các phương thức trợ giúp xem?

xml = Rabl.render @listings, 'feeds/listings', :format => :xml 
# do stuff with xml 

Tuy nhiên, tôi cần phải sử dụng nhiều phương pháp helper trong file view rabl tham chiếu, và tôi tiếp tục nhận được một NoMethodError như tôi mong đợi từ trả lời cho this question.

tôi đã cố gắng sử dụng extendsinclude trong lớp được sử dụng bởi các nhiệm vụ cào nhưng tôi vẫn nhận được lỗi tương tự về các phương pháp helper:

require "#{Rails.root}/app/helpers/feeds_helper.rb" 

class SerializeData 
    extends FeedsHelper 

    def perform 
    xml = Rabl.render @listings, 'feeds/listings', :format => :xml 
    # do stuff with xml 
    end 
end 

Câu hỏi của tôi là: có cách nào để sử dụng phương pháp helper trong rabl xem tập tin được tạo ra theo cách này? (hoặc ít nhất theo cách mà tôi vẫn có thể hiển thị chúng dưới dạng chuỗi trong tác vụ rake?) Các phương thức trợ giúp được sử dụng nhiều lần để định dạng chính xác các dữ liệu khác nhau theo yêu cầu cố định, vì vậy sẽ rất khó để xóa chúng hoàn toàn .

Trả lời

5

Tôi đã kết thúc bằng giải pháp khắc phục khỉ.

tôi nhận thấy rằng lỗi NoMethodFound đến từ một thể hiện của lớp Rabl::Engine, vì vậy tôi bao gồm các phương pháp định tuyến và helper cần thiết trong lớp đó và sau đó có thể truy cập chúng:

require "#{Rails.root}/app/helpers/feeds_helper.rb" 
... 
class Rabl::Engine 
    include Rails.application.routes.url_helpers 
    include FeedsHelper 
end 

Cũng lưu ý rằng chủ URL cần được thiết lập nếu sử dụng url ngoài path người giúp đỡ (ví dụ root_urlroot_path):

Rails.application.routes.default_url_options[:host] = "www.example.com" 

tôi chắc chắn sẽ muốn có một phi giải pháp vá khỉ hoặc ít nhất một nơi mà người trợ giúp có thể được đưa vào khi cần thiết tùy thuộc vào bộ điều khiển của hành động được hiển thị. Tôi sẽ chờ đợi để chấp nhận điều này để xem liệu có ai có thể đưa ra câu trả lời như vậy không.

4

Bạn có thể chuyển đối tượng phạm vi với tham số phạm vi. Vì vậy, nếu bạn có quyền truy cập vào một đối tượng với bao gồm các helper, giống như khi trong bối cảnh xem, sau đó bạn có thể vượt qua mà ví dụ:

<%= Rabl::Renderer.json(object_to_render, 'api/v1/object/show', view_path: 'app/views', scope: self).html_safe%> 

Vì vậy, bên ngoài bối cảnh xem bạn cần phải vượt qua trong một tùy chỉnh đối tượng với những người giúp đỡ bao gồm để làm sạch. ví dụ:

class RakeScope 
    include FeedHelper 
end 

Rabl::Renderer.json(object_to_render, 'api/v1/object/show', view_path: 'app/views', scope: RakeScope.new()) 

Tôi chưa thử lựa chọn thứ hai nhưng công trình đầu tiên tuyệt vời.

0

Trong khi không hoàn toàn giống nhau, tôi gặp phải sự cố tương tự khi truy cập người trợ giúp từ thông số RSpec. Tôi đã tạo ra một hàm trợ giúp tạo ra một phạm vi mà bạn có thể sử dụng để thêm bất kỳ trình trợ giúp nào bạn cần. Sau đây đã cho tôi truy cập vào đường dẫn và phương pháp trợ giúp url và một cái gì đó tương tự nên làm việc cho Rake.

#spec/support/rabl_helper.rb 
def render_rabl(object, options={}) 
    options = { 
    format: 'json', 
    view_path: 'app/views', 
    file:  example.example_group.top_level_description, 
    scope:  RablScope.new 
    }.merge(options) 

    result = Rabl.render(object, options.delete(:file), options) 
    options[:format] == 'json' ? JSON.parse(result) : result 
end 

class RablScope 
    include Rails.application.routes.url_helpers 
end 
Các vấn đề liên quan