2

레일의 모델에서 render_to_string은 어떻게합니까?레일즈 모델에서 render_to_string은 어떻게 작성합니까?

"모델에서 아무것도 렌더링하면 안됩니다. 렌더링은 컨트롤러와 뷰의 책임입니다." 날을 들어 보거나 문제를 해결할 수있는 더 좋은 방법을 제안하십시오.

내 모델은 우편물입니다. 이메일, 팩스가 아닙니다.

+1

루비의'to_s' 메쏘드 (거의 모든 것에 적용됩니다)는 무엇입니까? – bricker

+0

레일즈 뷰를 'to_s'할 수 없습니다. – maletor

+0

보기? 네가 모델이라고 말한 줄 알았는데? 약간의 의사 코드를 게시해야 할 수도 있습니다. 이제 나를 잃어 버렸습니다. :) – d11wtq

답변

3

여기서 일하고 코드 :

# instance_vars must follow the '@name' convention. 
# 
def render_template(template_content, options={}) 
    local_vars = options[ :local_vars ] || {} 
    instance_vars = options[ :instance_vars ] || {} 

    view = ActionView::Base.new(Rails::Configuration.new.view_path) 

    instance_vars.each do | name, value | 
    view.instance_variable_set(name, value) 
    end 

    rendering_options = { 
     :inline => template_content, 
     :type => :builder, 
     :locals => local_vars 
    } 

    view.render(rendering_options) 
end 

레일 2.3.14에서 테스트. 이 아이디어는 찾지 못했지만 편의성 방법으로 포장했습니다.

물론

, 나는 당신이 찾아 레일 3에서이 작업을 수행하려면 때문에이 ;-)

+1

레일 3에 대한 참고 사항 ActionView :: Base.new (Rails.root.join ('app', 'views')) – riley

3

우아한 솔루션을 찾고 있다면 아마도 ActionFaxer :: Base를 구현할 수 있습니다. ActionMailer::Base 구현을 따를 수는 있지만 팩스로 전문화 할 수 있습니다. 이 방법을 사용하면 render_to_string에 액세스 할 수 있습니다.

참고로이 경우 render_to_string을 모델에 추가하지 않고 대신 모델을 처리 할 Faxer 개념을 도입합니다.

모델 내에서 렌더링 템플릿을 임의로 지원해야하는 경우 erb 또는 다른 템플릿 언어 구현에 대해 직접 코딩 할 수 있습니다.

Faxer 개념에 대한 좋은 점은 전달을 전달하고 대기열에 넣고 배달을 보장하는 것과 같이 단순히 렌더링을 추상화 할 수 있다는 것입니다.

성공하면 어쩌면 끝내면 보석으로 바꿀 수 있습니다.

관련 문제