2017-10-09 9 views
0

나는모델 인스턴스에서 모델의 뷰에서 호출하는 메서드, 레일즈?

Micropost 
    belongs_to :user 

    def sanitized_gif_url 
    self.gif_url = Sanitize.fragment(micropost.gif_url, elements etc to sanitize here).html_safe 
    end 

내가 내 microposts에서 sanitized_gif_url보기를 호출하려는하지만이 코드를 수행 할 때 내가 undefined local variable or method sanitized_gif_url' for #<#<Class:0xb886cf0>

에게 난 단지 정말 인스턴스를 이해 얻을 rgrove의 살균 보석에서 내 모델의 살균 방법을/class 메서드는 매우 모호하지만, 필자의 관점에서 마이크로 포스트의 인스턴스에 내 메서드를 호출하고 싶습니다. 나는 이미 db의 원래 객체를 참조하는 self.gif_url을 호출하면 인스턴스에서 내 메서드를 실행하고 있다고 생각했습니다.

** 편집 : gif_url은 내가 위생 처리하려는 속성입니다.

보기 코드

_micropost.html.erb

당신이 쓴
.... 
<%= sanitized_gif_url %> (I know this doesnt look right) 
.... 
+1

보기에 코드를 추가해 주시겠습니까? – Eoghain

+0

추가됨. 매우 간단합니다, 나는 그 라인에 오류를 얻고 있습니다. –

답변

1

개체에 메서드를 명시 적으로 전달하지 않으면 뷰에서 뷰 인스턴스를 의미하는 self으로 전달됩니다. 따라서 Micropost 인스턴스에 메소드를 전달해야합니다 (예 : @micropost.sanitized_gif_url). 그 방법의 정의는 너무 약간의 오차가 있습니다 이것의 목적은 뷰의 살균 방법을 표시하는 경우

##Micropost.rb 
##micropost in micropost.gif_url is undefined. you can use self.gif_url or just gif_url, as self is implied. 
##I'd remove "self.gif_url =" too unless this is used in a callback to sanitize url before saving 
    def sanitized_gif_url 
    self.gif_url = Sanitize.fragment(gif_url, elements etc to sanitize here).html_safe 
    end 

하지만, 난 당신이보기 도우미 대신 Micropost하는 방법을 만드는 게 좋을 것.

##helpers/application_helper.rb 
def sanitized_gif_url(url) 
    Sanitize.fragment(url, elements etc to sanitize here).html_safe 
end 

## _micropost.html.erb 
<%= sanitized_gif_url(@micropost.gif_url) %> 

이점은 모델과 뷰에 대한 관심의 분리입니다. 또한 Micropost의 특정 구현에 대한 #sanitized_gif_url의 의존성을 제거했습니다. 그래서 당신이 원하는 다른 url이나 url을 가진 모델에 대해이 메소드를 사용할 수 있습니다.

+0

이것은 모두 의미가있는 것처럼 보입니다. 나는 이것을 옳은 것으로 표시 할 것입니다. 내가 이미 알아 낸 것처럼 첫 번째 예제로 갔지만 두 번째 잘 보인다 :) –

1

당신의 sanitized_gif_url 그것이 Micropost 클래스의 인스턴스에서 호출해야한다는 의미 인스턴스 방법으로.

당신이 말하는 뷰의 컨트롤러는 뷰가 액세스 할 수있는 인스턴스 변수로 Micropost 인스턴스를 설정해야합니다. @micropost = Micropost.find(params[:id]) 같은 뭔가가이 방법으로 무엇을 수정보기에 그런

(당신이보기에서 작업하는 Micropost의 특정 인스턴스를 얻을) : 인스턴스 방법의 하나 개의 인스턴스에서 호출 <%= @micropost.sanitized_gif_url %>

수업. 클래스 메서드는 클래스 자체에서 호출됩니다.

+0

고맙습니다. 저는 많은 것들을 이해하기 시작했을 때이 도움에 약간의 도움이 필요했습니다. –