Rails 3.1限制子模型的数量

大家好我有两个模型:用户(又名父母)和Profil(又名儿童)。我想将用户的个人资料数量限制为一个。

车型/ user.rb

class User < ActiveRecord::Base has_one :profil end 

车型/ profil.rb

 class Profil  :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 

控制器/ profils_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 

我做错了什么?

查看limit_profil_to_one中的第2行 – self.user为nil,因此失败。

 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?我假设你实际上是指个人资料)你应该将控制器中的用户设置为它应该是的用户,就像这样。

 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