2011-06-18 6 views
0

J'ai suivi ces questions (one et two) sur la façon d'ajuster mes méthodes avec l'utilisateur actuel seulement afin qu'ils aient l'user_id spécifique pour éditer, mettre à jour, créer et détruire leurs produits .@ mymodel.user = current_user ne fonctionne pas pour moi

Voici mon code:

Ma Migration:

class CreateProducts < ActiveRecord::Migration 
    def self.up 
    create_table :products do |t| 
     t.string :name 
     t.date :date 
     t.decimal :price, :default => 0, :precision => 10, :scale => 2 
     t.integer :user_id 
     t.float :latitude 
     t.float :longitude 

le contrôleur:

class ProductsController < ApplicationController 
    before_filter :authenticate_user! 

    def index 
    @products = Product.all 

    def show 
    @product = Product.find(params[:id]) 

    def new 
    @product = Product.new 

    def edit 
    @product.user = current_user 
    @product = Product.find(params[:id]) 
    end 

    def create 
    @product.user = current_user 
    @product = Product.new(params[:product]) 

    def update 
    @product.user = current_user 
    @product = Product.find(params[:id]) 


    def destroy 
    @product.user = current_user 
    @product = Product.find(params[:id]) 
    @product.destroy 

Modèle de produit:

class Product < ActiveRecord::Base 
    attr_accessible :name, :date, :price, :tag_list 
    belongs_to :user 
end 

alors le modèle utilisateur Devise:

class User < ActiveRecord::Base 

    devise :database_authenticatable, :registerable, 
     :recoverable, :rememberable, :trackable, :validatable 
    attr_accessible :email, :password, :password_confirmation, :remember_me 

    has_many :products,  :dependent => :destroy 

J'essaie de le soumettre et puis tout à coup cette affiche:

NoMethodError à créer # ProduitsController

undefined method `user=' for nil:NilClass 

Qu'est-ce que je manque ou faire du tort?

Merci d'avance!

Répondre

2

Vous essayez d'attribuer @ product.user avant d'avoir un produit. Faites votre recherche sur le produit d'abord, puis affectez l'utilisateur.

@product = Product.find(params[:id]) 
@product.user = current_user 

Pour les actions autres que créer où vous voulez limiter le produit au current_user, vous pouvez faire quelque chose comme ceci (en supposant que la configuration de l'association has_many :products dans votre modèle User.

@product = current_user.products.find(params[:id]) 

Ce va limiter la recherche aux seuls produits qui ont l'id_utilisateur égal à l'utilisateur_courant

+0

Oh wow je ne connaissais pas la commande, je pensais que toutes les actions se produisaient en même temps, cela fonctionne et je peux le créer mais je peux toujours comme les autres utilisateurs, détruire et éditer d'autres produits d'utilisateurs. Comment puis-je corriger cela? – LearningRoR

+0

Voir les ajouts à ma réponse. –

+0

Merci beaucoup Monsieur! – LearningRoR