###前提・実現したいこと
userとuser_profileというモデルを作成しい1対1の関係性を作り、
user_profileに特技(user_skill)を追加するためにuser_skillとuser_profileとの関係を多対多にする。
userはあらかじめ、アカウント登録時に作成されるとする。この時にuser_profileは登録しない。
user_profileは別のcontrollersのクラスで作成できるようにし、user_profileの登録と同時にuser_skillも登録できるようにしたい。
###該当のソースコード
model class User has_one :profile, foreign_key: 'id', class_name: 'UserProfile' class UserProfile has_many :user_skills, dependent: :destroy has_many :skills, through: :user_skills accepts_nested_attributes_for :skills, allow_destroy: true, limit: 10 belongs_to :user, foreign_key: 'id' self.table_name = 'worker_profiles' self.primary_key = :id belongs_to :worker, foreign_key: 'id' before_create { self.id = self.worker.id } class UserSkill belongs_to :user_profile, optional: true belongs_to :skill class Skill has_many :user_skills has_many :user_profiles, through: :user_skill
controller def new @user = current_user if @user && @user.activated? @user_profile = @user.build_profile else redirect_to root_url end end def create @user = current_user @user_profile = @user.build_profile(profile_params) if @user_profile.save flash[:success] = 'プロフィールを作成しました' redirect_to worker_path(username: @user.username) else render :new end end private def profile_params params.require(:worker_profile).permit( :プロフィール登録情報, { :skill_ids => [] } ) end # :プロフィール登録情報には画像や性別等の情報が入ります。
試した事
skill_idsの情報がないときは、user_profileは登録できます。
困っている事
profile_paramsには登録する情報が帰ってきているが、saveをするとfalseになってしまう。
user_skillの情報もbinding.pryを挟み
@user_profile.skillsとすると、
id: nil, user_profile_id: nil, skill_id: 1, created_at: nil, updated_at: nil>, id: nil, user_profile_id: nil, skill_id: 2, created_at: nil, updated_at: nil>, id: nil, user_profile_id: nil, skill_id: 3, created_at: nil, updated_at: nil>, id: nil, user_profile_id: nil, skill_id: 4, created_at: nil, updated_at: nil>, id: nil, user_profile_id: nil, skill_id: 5, created_at: nil, updated_at: nil>
以上の情報がかえってきます。
しかし、@user_profile.saveをするとfalseになってしまいます。
どなたか誤解とうよろしくお願いいたします。
あなたの回答
tips
プレビュー