2017-10-09 1 views
0

J'ai une méthode de désinfection dans mon modèle de la gemme sanitize de rgroveMéthode d'appel de la vue dans le modèle sur l'instance du modèle, rails?

Micropost 
    belongs_to :user 

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

Je veux appeler sanitized_gif_url dans mes microposts voir mais quand je fais avec ce code je reçois undefined local variable or method sanitized_gif_url' for #<#<Class:0xb886cf0>

Je ne comprends vraiment exemple/méthodes de classe très vaguement mais je sais que je veux appeler ma méthode sur mon exemple de micropost à mon avis. Je pensais que je faisais déjà cela quand j'appelle self.gif_url en se référant à l'objet original dans la DB puis exécutez ma méthode sur l'instance.

** EDIT: gif_url est l'attribut que je veux désinfecter.

Voir le code

_micropost.html.erb

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

Pourriez-vous s'il vous plaît ajouter le code que vous avez dans la vue? – Eoghain

+0

Ajouté C'est très simple, je reçois l'erreur sur cette ligne :) –

Répondre

1

Sans passer une méthode explicitement à un objet, il est passé à self, ce qui dans une vue signifie une instance de vue. Vous devez donc passer votre méthode à une instance Micropost à la place (par exemple @micropost.sanitized_gif_url). Sa définition de la méthode a aussi quelques erreurs aussi:

##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 

Cependant, si le but est de montrer une méthode aseptisé dans les vues, je vous suggère de créer une aide de vue au lieu d'une méthode pour 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) %> 

L'avantage de ceci est la séparation des préoccupations pour le modèle et la vue. Vous avez également éliminé la dépendance de #sanitized_gif_url sur l'implémentation particulière de Micropost. Vous pouvez donc utiliser cette méthode pour d'autres URL ou modèles avec des URL que vous souhaitez désinfecter.

+0

Cela semble avoir du sens, je vais marquer cela comme correct. Je suis allé avec le premier exemple comme je l'ai déjà compris, mais la seconde semble bien aussi :) –

1

Vous avez écrit votre sanitized_gif_url comme une méthode d'instance qui signifie qu'elle doit être appelée sur une instance de la classe Micropost.

Le contrôleur de la vue dont vous parlez doit définir l'instance Micropost en tant que variable d'instance pour la vue à laquelle accéder. Quelque chose comme @micropost = Micropost.find(params[:id]) (obtenir l'instance spécifique de Micropost vous travaillez avec la vue)

Puis dans la vue de modifier ce que vous avez ainsi: <%= @micropost.sanitized_gif_url %>

Une méthode d'instance est appelée sur une instance de la classe. Une méthode de classe est appelée sur la classe elle-même.

+0

Merci, j'avais besoin d'un peu d'aide sur celui-ci quand j'ai commencé à essayer de comprendre beaucoup de choses. –