Eu segui estas perguntas ( uma e duas ) sobre como ajustar meus methods com o usuário atual apenas para que eles tenham o user_id específico para editar, atualizar, criar e destruir seus produtos.
Aqui está o meu código:
Minha migration:
class CreateProducts 0, :precision => 10, :scale => 2 t.integer :user_id t.float :latitude t.float :longitude
o controlador:
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
Modelo do produto:
class Product < ActiveRecord::Base attr_accessible :name, :date, :price, :tag_list belongs_to :user end
então o modelo de usuário do Devise:
class User :destroy
Eu tento enviá-lo e, de repente, isso aparece:
NoMethodError in ProductsController # create
undefined method `user=' for nil:NilClass
O que estou perdendo ou fazendo errado?
Desde já, obrigado!
Você está tentando atribuir @ product.user antes de ter um produto. Primeiro, ache o produto primeiro e atribua o usuário.
@product = Product.find(params[:id]) @product.user = current_user
Para as ações diferentes de create, onde você deseja restringir o produto ao current_user, é possível fazer algo assim (supondo que você tenha configurado a has_many :products
association no seu modelo de User
.
@product = current_user.products.find(params[:id])
Isso restringirá a localização apenas para os produtos que possuem o user_id igual ao current_user.