我试图在我的用户注册该网站时创建个人资料模型。正如我现在所知,在使用正确的外键注册时正在创建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。
这是在注册时创建模型的方法吗?如果是,我该如何修复编辑/更新方法?
还是有更好的方法吗?
答案 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])