【发布时间】:2013-09-30 21:22:14
【问题描述】:
这是我通过 Rails 4 JSON API 注册一种名为导师的用户的功能代码。
现在我想知道,有没有更好的方法来解决这个问题?一种更清洁/更简单的方法,Rails 可以自动创建用户/导师关联。
目前我在create 方法中手动设置它,这似乎不正确。所以我只是想确保没有更好的方法来解决这个问题。
models/user.rb
class User < ActiveRecord::Base
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable and :omniauthable
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable
belongs_to :role, :polymorphic => true
end
models/mentor.rb
class Mentor < ActiveRecord::Base
has_one :user, as: :role
accepts_nested_attributes_for :user
end
controllers/api/V1/mentors_controller.rb
class Api::V1::MentorsController < ApplicationController
respond_to :json
def create
@user = User.new(user_params)
@mentor = Mentor.new(mentor_params)
@user.role = @mentor
@user.save!
@mentor.user_id = @user.id
@mentor.save!
respond_with :api, @mentor
end
private
def mentor_params
params.require(:mentor).permit(:first_name, :last_name)
end
def user_params
params.require(:user).permit(:email, :password)
end
end
更新 - 2013 年 10 月 1 日
我在这方面取得了更多进展。这是我现在拥有的:
controllers/api/V1/mentors_controller.rb
class Api::V1::MentorsController < ApplicationController
respond_to :json
def create
@mentor = Mentor.new(mentor_params)
@mentor.user.save!
@mentor.user_id = @mentor.user.id
@mentor.save!
respond_with :api, @mentor
end
private
def mentor_params
params.require(:mentor).permit(:first_name, :last_name, user_attributes: [:email, :password])
end
end
但我仍然需要手动设置 user_id。只做Mentor.create(mentor_params) 设置user_id 失败。有什么办法可以解决吗?
【问题讨论】:
-
您是否尝试在用户中创建
mentor=方法? Rails 应该采用 params[:user][:mentor] 并将其传递给mentor=方法。然后你可以构建你的 Mentor.new 并在你的用户类中做所有其他的事情。你的控制器应该变成@user = User.new(user_params)@user.save!respond_with :api, @user.mentor。 -
@jeremywoertink 我不想把所有东西都放在一个用户控制器中。我将有几个具有不同字段的不同用户类型。所以我宁愿将逻辑分离到他们自己的控制器中。
标签: ruby devise ruby-on-rails-4 polymorphic-associations