2011-11-17 88 views
0

好家伙数目我有2种型号:用户(又名父)和PROFIL(又名子)。而我想限制PROFIL数量的用户之一。的Rails 3.1的限制儿童模特

型号/ user.rb

class User < ActiveRecord::Base 

    has_one :profil 

end 

型号/ profil.rb

class Profil < ActiveRecord::Base 
    attr_accessible :logo 
    belongs_to :user 
    mount_uploader :logo, ImageUploader 


    validate :limit_profil_to_one, :on => :create 

    def limit_profil_to_one 
     if self.user.profils(:reload).count > 1 
     errors.add(:base, "Exceeded thing limit") 
     end 
    end 
end 

但是当我尝试创建一个PROFIL我收到以下错误信息:

NoMethodError (undefined method `profils' for nil:NilClass): 
    app/models/profil.rb:11:in `limit_profil_to_one' 
    app/controllers/profils_controller.rb:52:in `block in create' 
    app/controllers/profils_controller.rb:51:in `create 

controllers/p rofils_controller.rb

# -*- encoding : utf-8 -*- 

class ProfilsController < ApplicationController 


    # GET /factures 
    # GET /factures.json 
    def index 
    @profils = Profil.all 

    respond_to do |format| 
     format.html # index.html.erb 
     format.json { render json: @profil } 
    end 
    end 

    # GET /profils/1 
    # GET /profils/1.json 
    def show 
    @profil = Profil.find(params[:id]) 

    respond_to do |format| 
     format.html # show.html.erb 
     format.json { render json: @profil } 
    end 
    end 

    # GET /profils/new 
    # GET /profils/new.json 
    def new 
    @profil = Profil.new 

    respond_to do |format| 
     format.html # new.html.erb 
     format.json { render json: @profil } 
    end 
    end 

    # GET /profils/1/edit 
    def edit 
    @profil = Profil.find(params[:id]) 
    end 

    # POST /profils 
    # POST /profils.json 
    def create 
    @profil = Profil.new(params[:profil]) 

    respond_to do |format| 
     if @profil.save 
     format.html { redirect_to @profil, notice: 'Profil was successfully created.' } 
     format.json { render json: @profil, status: :created, location: @profil } 
     else 
     format.html { render action: "new" } 
     format.json { render json: @profil.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    # PUT /profils/1 
    # PUT /profils/1.json 
    def update 
    @profil = Profil.find(params[:id]) 

    respond_to do |format| 
     if @profil.update_attributes(params[:profil]) 
     format.html { redirect_to @profil, notice: 'Profil was successfully updated.' } 
     format.json { head :ok } 
     else 
     format.html { render action: "edit" } 
     format.json { render json: @profil.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    # DELETE /factures/1 
    # DELETE /factures/1.json 
    def destroy 
    @profil = Profil.find(params[:id]) 
    @profil.destroy 

    respond_to do |format| 
     format.html { redirect_to profils_url } 
     format.json { head :ok } 
    end 
    end 
end 

我在做什么错了?

+0

我们需要看到您的控制器,请 –

+0

我这样做已经但是你是有“异型材”注意,​​但是这不是一个一对多(用于复数),insted的,这是一个HAS_ONE所以应该是“ profil'在这种情况下。 –

+0

心中已经改成了PROFIL,我仍然得到以下错误'未定义的方法“PROFIL”为无:NilClass' – blawzoo

回答

1

看在limit_profil_to_one线2 - self.user是零,因此失败。

def limit_profil_to_one 
    if self.user.profils(:reload).count > 1 # self.user is nil 
     errors.add(:base, "Exceeded thing limit") 
    end 
end 

我在做什么你的应用做一些假设,但对于这个职位,我会认为你的控制器具有在控制器中定义的当前用户和您为该用户创建一个PROFIL(方:请注意,什么是profil?我假设你实际上是指profile)你应该将控制器中的用户设置为它应该是的用户,就像这样。

def create 
    @profil = Profil.new(params[:profil]) 
    @profil.user = current_user # however you access the currently logged in user 

    respond_to do |format| 
     if @profil.save 
      format.html { redirect_to @profil, notice: 'Profil was successfully created.' } 
      format.json { render json: @profil, status: :created, location: @profil } 
     else 
      format.html { render action: "new" } 
      format.json { render json: @profil.errors, status: :unprocessable_entity } 
     end 
    end 
end 
+0

谢谢您的回答,但 – blawzoo

+0

感谢一些代码将是有益的兰森布里格斯你砍使it.I've标志着你的答案 – blawzoo