这是我通过Rails 4 JSON API注册一种名为mentor的用户的功能代码。
现在我想知道,有更好的方法可以解决这个问题吗?一种更清洁/更简单的方法,Rails可以自动创建用户/指导者关联。
目前我在create
方法中手动设置它似乎不正确。所以我只是想确保没有更好的方法来解决这个问题。
模型/ 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
模型/ mentor.rb
class Mentor < ActiveRecord::Base
has_one :user, as: :role
accepts_nested_attributes_for :user
end
控制器/ 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年1月10日
我对此有了更多的了解。这就是我现在所拥有的:
控制器/ 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。有办法解决这个问题吗?
答案 0 :(得分:1)
这不是我的头脑,但基本的想法是这样的。
使用嵌套资源创建表单
form_for @mentor do |f|
f.input :mentor_val
f.fields_for :user do |m|
m.input :user_val
它应该发布一个params对象,其格式如下:
mentor: {
mentor_val: 'blah'
user_attributes: {
user_val: 'foo'
}
}
现在,由于您已在Mentor模型中包含accepts_nested_attributes_for
,因此Rails会自动向user_attributes=
添加Mentor
方法,以构建用户模型,包括设置关系。这意味着要创建两个模型,您需要在控制器中执行的操作是
@mentor.create(params)
答案 1 :(得分:1)
要回答有关更新的问题,请尝试将ID添加到params白名单中:
def mentor_params
params.require(:mentor).permit(:first_name, :last_name,user_attributes: [:id, :email, :password])
end