不确定在嵌套资源中放置什么强参数
Not sure what to put for strong parameters in nested resource
我正在尝试调试一个不会玩球的控制器。我已将其缩小到无法正常工作的强参数,因此我在 rails 控制台上进行了尝试。
params = ActionController::Parameters.new({
"user"=> {
"login"=>"username",
"password"=>"[FILTERED]"
},
"staff_id"=>"1"
})
这 returns,如您所料:
=> {"user"=>{"login"=>"username", "password"=>"[FILTERED]"}, "staff_id"=>"1"}
所以,我尝试过滤参数,就像这样...
params.require(:staff_id)
=> "1"
> params.require(:user).permit(:password,:login)
=> {"password"=>"[FILTERED]", "login"=>"username"}
看起来不错。
在我的控制器中,我有:
def create
@staff=Staff.find(params[:staff_id])
@user = @staff.create_user(reg_params[:user])
DISASTER
现在,在灾难发生时,用户对象@user 应该设置登录名和密码,但事实并非如此。那时我已经尝试记录 @user 对象,它的属性为 nil。
为什么我的用户对象没有正确创建?如果我删除 DISASTER,它会创建一个包含空白字段的数据库记录,时间戳除外。
型号:
class Staff < ActiveRecord::Base
belongs_to :user
end
class User < ActiveRecord::Base
has_one :staff
end
架构:
ActiveRecord::Schema.define(version: 20150909102012) do
create_table "staff", force: :cascade do |t|
t.string "qualifications"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.integer "user_id"
end
add_index "staff", ["users_id"], name: "index_staff_on_users_id"
create_table "users", force: :cascade do |t|
t.string "login"
t.string "username"
t.string "password"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
end
它可以路由到自定义控制器。路线如下:
Rails.application.routes.draw do
resources :staff do
resource :user, shallow: true, controller: 'staff_register'
end
resources :users
应用程序中没有其他任何东西,因为它只是一个实验,可以帮助我解决我一直在努力解决的更大问题。
基本上,我希望能够 link 将员工模型转换为用户模型。我想我已经做到了,我只需要帮助找出强参数位。
编辑:这是嵌套资源的形式:
<%= form_for @user, :url => staff_user_path(@staff) do |f| %>
<% if @user.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(@user.errors.count, "error") %> prohibited this user from being saved:</h2>
<ul>
<% @user.errors.full_messages.each do |message| %>
<li><%= message %></li>
<% end %>
</ul>
</div>
<% end %>
<div class="field">
<%= f.label :login %><br>
<%= f.text_field :login %>
</div>
<div class="field">
<%= f.label :password %><br>
<%= f.text_field :password %>
</div>
<div class="actions">
<%= f.submit %>
</div>
<% end %>
这一行:
@user = @staff.create_user(reg_params[:user])
reg_params
已经为您提供了包含所有允许参数的哈希值:
{"password"=>"[FILTERED]", "login"=>"username"}
那里没有 user
键,因此 reg_params[:user]
就是 nil
。相反,您需要这样做:
@user = @staff.create_user(reg_params)
现在,您无需担心此处的 staff_id
,因为您正在对已存在的 @staff
模型执行 create_user
方法。此方法将处理关联。
我正在尝试调试一个不会玩球的控制器。我已将其缩小到无法正常工作的强参数,因此我在 rails 控制台上进行了尝试。
params = ActionController::Parameters.new({
"user"=> {
"login"=>"username",
"password"=>"[FILTERED]"
},
"staff_id"=>"1"
})
这 returns,如您所料:
=> {"user"=>{"login"=>"username", "password"=>"[FILTERED]"}, "staff_id"=>"1"}
所以,我尝试过滤参数,就像这样...
params.require(:staff_id)
=> "1"
> params.require(:user).permit(:password,:login)
=> {"password"=>"[FILTERED]", "login"=>"username"}
看起来不错。
在我的控制器中,我有:
def create
@staff=Staff.find(params[:staff_id])
@user = @staff.create_user(reg_params[:user])
DISASTER
现在,在灾难发生时,用户对象@user 应该设置登录名和密码,但事实并非如此。那时我已经尝试记录 @user 对象,它的属性为 nil。
为什么我的用户对象没有正确创建?如果我删除 DISASTER,它会创建一个包含空白字段的数据库记录,时间戳除外。
型号:
class Staff < ActiveRecord::Base
belongs_to :user
end
class User < ActiveRecord::Base
has_one :staff
end
架构:
ActiveRecord::Schema.define(version: 20150909102012) do
create_table "staff", force: :cascade do |t|
t.string "qualifications"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.integer "user_id"
end
add_index "staff", ["users_id"], name: "index_staff_on_users_id"
create_table "users", force: :cascade do |t|
t.string "login"
t.string "username"
t.string "password"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
end
它可以路由到自定义控制器。路线如下:
Rails.application.routes.draw do
resources :staff do
resource :user, shallow: true, controller: 'staff_register'
end
resources :users
应用程序中没有其他任何东西,因为它只是一个实验,可以帮助我解决我一直在努力解决的更大问题。
基本上,我希望能够 link 将员工模型转换为用户模型。我想我已经做到了,我只需要帮助找出强参数位。
编辑:这是嵌套资源的形式:
<%= form_for @user, :url => staff_user_path(@staff) do |f| %>
<% if @user.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(@user.errors.count, "error") %> prohibited this user from being saved:</h2>
<ul>
<% @user.errors.full_messages.each do |message| %>
<li><%= message %></li>
<% end %>
</ul>
</div>
<% end %>
<div class="field">
<%= f.label :login %><br>
<%= f.text_field :login %>
</div>
<div class="field">
<%= f.label :password %><br>
<%= f.text_field :password %>
</div>
<div class="actions">
<%= f.submit %>
</div>
<% end %>
这一行:
@user = @staff.create_user(reg_params[:user])
reg_params
已经为您提供了包含所有允许参数的哈希值:
{"password"=>"[FILTERED]", "login"=>"username"}
那里没有 user
键,因此 reg_params[:user]
就是 nil
。相反,您需要这样做:
@user = @staff.create_user(reg_params)
现在,您无需担心此处的 staff_id
,因为您正在对已存在的 @staff
模型执行 create_user
方法。此方法将处理关联。