在Devise用户注册时创建另一个模型

时间:2015-01-09 17:37:50

标签: ruby-on-rails ruby ruby-on-rails-4 devise

我试图在我的用户注册该网站时创建个人资料模型。正如我现在所知,在使用正确的外键注册时正在创建Profile模型。我的问题在于在用户完成设计确认步骤后尝试更新配置文件模型。

我的用户被称为"艺术家"。

### /artists/registrations_controller.rb ###

class Artists::RegistrationsController < Devise::RegistrationsController
  # GET /resource/sign_up
  def new
    super
    @profile = @artist.build_artist_profile
  end

  # POST /resource
  def create
    super
    @profile = @artist.create_artist_profile(profile_params)
  end

 private

  def profile_params
    params.permit(:biography, :location, :genre, :members, :facebook_url, :twitter_url, :youtube_url, :itunes_url, :amazon_url)
  end

end

### /artists/profiles_controller ###

class Artists::ProfilesController < ApplicationController

  before_action :authenticate_artist!
  before_action :correct_artist
  before_action :set_artist

  def edit
    @profile = ArtistProfile.find_by(params[:artist_id])
  end

  def update
    @profile = ArtistProfile.find_by(params[:artist_id])
    if @profile.update_attributes(profile_params)
      redirect_to current_artist
    else
      redirect_to root_url
    end
  end

  private

    def set_artist
      @artist = current_artist
    end

    def correct_artist
      @artist = current_artist
      if @artist != Artist.find(params[:id])
        redirect_to artist_path
      end
    end

    def profile_params
      params.require(:artist_profile).permit(:biography, :location, :genre, :members, :facebook_url, :twitter_url, :youtube_url, :itunes_url, :amazon_url)
    end

end

### /artist.rb ###

class Artist < ActiveRecord::Base
  devise :database_authenticatable, :registerable, :recoverable, :rememberable, :trackable, :validatable, :confirmable, :lockable, :timeoutable
  has_one :artist_profile, dependent: :destroy

### /artist_profile.rb ###

class ArtistProfile < ActiveRecord::Base
  belongs_to :artist
  validates :artist_id, presence: true
end

我将自己的代码放入create方法的Devise注册控制器中。注册后,ArtistProfile模型将被创建并填充空白字符串,这是完美的。但是,如果我尝试编辑/更新单个艺术家的个人资料,则只会更新第一个艺术家的个人资料。

即。艺术家1注册并创建配置文件2。艺术家1通过编辑页面将个人资料1的位置更新为布法罗。艺术家2注册并创建配置文件2。艺术家2将个人资料2的位置更新为纽约,但个人资料1的位置已更新,而不是个人资料2。

这是在注册时创建模型的方法吗?如果是,我该如何修复编辑/更新方法?

还是有更好的方法吗?

1 个答案:

答案 0 :(得分:3)

这行代码不正确:

@profile = ArtistProfile.find_by(params[:artist_id])

修复方法是找到艺术家,然后获取个人资料:

@profile = Artist.find(params[:artist_id]).artist_profile

优化:

@artist = Artist.find(params[:artist_id]).includes(:artist_profile)
@profile = @artist.artist_profile

或者,如果您的控制器正在接收艺术家个人资料ID,那么您可以执行此修复:

@profile = ArtistProfile.find(params[:artist_profile_id])