不确定在嵌套资源中放置什么强参数

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 方法。此方法将处理关联。