为什么我的加入不合作?

时间:2015-03-31 13:17:27

标签: mysql ruby-on-rails postgresql ruby-on-rails-4

用户有一个个人资料。配置文件属于用户。查询似乎在postgres中工作,但我没有让关联在视图中正常工作。以下是查询结果:

  User Load (0.4ms)  SELECT "users".* FROM "users"   ORDER BY "users"."id" ASC
  User Load (0.3ms)  SELECT  "users".* FROM "users"  WHERE "users"."id" = 5 ORDER BY "users"."id" ASC LIMIT 1
  Profile Load (0.3ms)  SELECT  "profiles".* FROM "profiles"  WHERE "profiles"."user_id" = $1 LIMIT 1  [["user_id", 5]]

以下是用户和个人资料的两种模式:

用户:

class User < ActiveRecord::Base

   devise :database_authenticatable, :registerable,
     :recoverable, :rememberable, :trackable, :validatable, :confirmable

   has_one :profile, dependent: :destroy

   accepts_nested_attributes_for :profile, allow_destroy: true

end

资料:

class Profile < ActiveRecord::Base

   belongs_to :user, polymorphic: true

end

控制器......

用户:

class UsersController < ApplicationController

   def index
      @profiles = Profile.all
      @users = User.all.order(:id)
      User.joins(:profile)
   end

   private
      def set_user
         @user = User.find(params[:id])
      end

 end

资料:

class ProfilesController < ApplicationController
   before_action :set_profile, only: [:show, :edit, :update, :destroy]

   # GET /profiles
   # GET /profiles.json
   def index
      @profiles = Profile.all
   end

   # GET /profiles/1
   # GET /profiles/1.json
   def show
   end

   # GET /profiles/new
   def new
      @profile = Profile.new
   end

   # POST /profiles
   # POST /profiles.json
   def create
      @profile = Profile.new(profile_params)

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

 private

   def set_profile
      @profile = Profile.find(params[:id])
   end

   def profile_params
      params.require(:profile).permit(:user_id)
   end

最后在/ users / index视图中:

<%= user.profile.user_id %>

但是当我尝试渲染视图时,收到以下错误:

未定义的方法`user_id&#39;为零:NilClass

我感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

如果你真的不需要关联是多态的,那么你应该从Profile模型中删除它。

class Profile < ActiveRecord::Base

   belongs_to :user
end

但是如果你确实需要关联是多态的,那么你需要改变User模型。

class User < ActiveRecord::Base

   devise :database_authenticatable, :registerable,
     :recoverable, :rememberable, :trackable, :validatable, :confirmable

   has_one :profile,
      dependent: :destroy,
      as: user

   accepts_nested_attributes_for :profile, allow_destroy: true

end

您还需要在user_type模型中添加Profile