2016-02-04 2 views
1

Je fais ce que je suppose être un problème simple mais je ne peux pas le comprendre. J'essaye de mettre à jour un attribut dans un modèle quand un autre est créé.Rubis sur rails. Passer des params de la vue au contrôleur

À mon avis:

<%= link_to 'Click here to rate this user', new_user_review_path(:user_id => request.user.id, :gigid => request.gig.id), remote: true %> 

qui passe params :gigid et :user_id

que mon contrôleur:

def new 
    @review = Review.new 
    @gig = Gig.find(params[:gigid]) 
end 

    def create 
    @review = @user.reviews.new review_params 
    @review.reviewed_id = current_user.id 
     if @review.save 
     @gig.update(reviewed: true) 
     respond_to do |format| 
      format.html {redirect_to session.delete(:return_to), flash[:notice] = "Thankyou for your rating!"} 
      format.js 
     end 
    else 
     render 'new' 
    end 
    end 

Mais je reçois undefined method 'update'for nil:NilCLass:

Je sais que les params passent et le 'Gig' peut être mis à jour ATED comme:

def new 
    @review = Review.new 
    Gig.find(params[:gigid]).update(reviewed: true) 
end 

met à jour l'attribut bien, mais quand je clique sur « nouvel » pas lorsque l'examen est effectivement créée.

Ajout:

def create 
    @review = @user.reviews.new review_params 
    @review.reviewed_id = current_user.id 
     if @review.save 
     Gig.find(params[:gigid]).update(reviewed: true) 

etc etc etc 

me donne la même undefined method 'update'for nil:NilCLass:

J'ai essayé avec find_by_id au lieu de find qui ne fait aucune différence.

EDIT:

def create 
@gig = Gig.find params[:gigid] 
@review = @user.reviews.new review_params 
    @review.reviewed_id = current_user.id 
     if @review.save 
     @gig.update(reviewed: true) 
    etc etc etc 

ne fonctionne pas non plus. Je n'ai pas d'erreur, mais l'identifiant du concert est toujours 'nul'.

Les paramètres passent à l'action "Nouveau" mais pas à l'action "Créer". Je pense que ça devrait être très facile mais je ne le vois pas pour le moment.

+0

Vous obtenez cette erreur beacuse Gig.find (params [: gigid]) renvoie Nil. Assurez-vous que params [: gigid] est un identifiant valide qui existe dans la base de données afin qu'il puisse le trouver. Devrait probablement faire une vérification qui n'est pas nulle avant d'essayer d'appeler la méthode de mise à jour aussi. – Klante

+0

Je suis confus, alors. Votre «nouvelle» action ne rend pas un modèle ou quoi que ce soit? Comment appelez-vous 'créer'? Votre link_to génère un lien vers votre "nouvelle" action. –

+0

Je le fais par ajax, mais sans javascript, je suis redirigé vers la nouvelle page de révision qui rend un formulaire partiel. Je remplis ensuite et enregistre/crée la revue. Je souhaite que l'attribut soit mis à jour lors de la sauvegarde/création. –

Répondre

1

Mais j'obtiens méthode non définie « update'for nulle: NilClass:

L'erreur est que vous n'avez pas défini @gig dans votre action create.

Depuis Rails est construit sur HTTP et HTTP is stateless, vous devez définir les variables « instance » à chaque nouvelle demande:

def new 
    @review = Review.new 
    @gig = Gig.find params[:gigid] 
end 

def create 
@gig = Gig.find params[:gigid] 
@review = @user.reviews.new review_params 

Un modèle mieux beaucoup pour vous d'utiliser le rappel after_create dans votre modèle Review:

#app/models/review.rb 
class Review < ActiveRecord::Base 
    belongs_to :gig #-> I presume 
    after_create :set_gig 

    private 

    def set_gig 
     self.gig.update(reviewed: true) 
    end 
end 

-

Si vous voulez faire la mise à jour Gig au sein de votre configuration actuelle, vous serez mieux envoyer le gig_id par la demande param (pas le lien):

#app/views/reviews/new.html.erb 
<%= form_for [@user, @review] do |f| %> 
    <%= f.hidden_field :gig_id, @gig.id %> #-> params[:reviews][:gig_id] 
    ... 
<% end %> 

Cela rendra params[:review][:gig_id] disponible dans l'action create , avec lequel vous pourrez utiliser dans votre code.

+1

Comme j'ai besoin d'autres conditions, j'ai utilisé la dernière méthode. Avec le champ caché et les paramètres [: review] [: gig_id], cela fonctionne correctement. Je ne sais pas pourquoi j'ai raté ça. Merci. –

0

Essayez le code ci-dessous pour l'opération de mise à jour.

gig_record = Gig.find_by_id(params[:gigid]) 
gig_record.update_attribute(reviewed: true) unless gig_record.blank? 
+0

Cela me donne aussi la méthode indéfinie 'update_attribute' pour nil: NilClass. –

1

Le problème est que vous n'avez jamais attribué de valeur à @gig dans votre méthode create. Je ne vois pas votre formulaire, mais vous avez besoin quelque chose comme ceci dans votre méthode de création:

@gig = Gig.find params[:gigid] 

En supposant que vous passez le paramètre: gigid à #create

Dans le deuxième exemple que vous avez montré, Je ne suis pas sûr de ce qui se passe, mais vous devriez obtenir une exception ActiveRecord :: RecordNotFound sur find().

+0

J'ai essayé @gig = Gig.find params [: gigid] puis @ gig.update (revu: true) qui ne fonctionne pas non plus, l'ID = NIL. Cela ne fonctionne que dans l'action "Nouveau". J'utilise link_to, pas un formulaire. Mon lien est le premier morceau de code dans ma question. –