【问题标题】:param is missing or the value is empty - Rails 4 Engine参数丢失或值为空 - Rails 4 Engine
【发布时间】:2016-04-25 07:24:26
【问题描述】:

我正在构建我的第一个模块化应用程序,我的第一个模块是 Account,我的目标是让这个模块通过 Devise 处理所有不同的用户模型授权。

我的第一个用户类型是“用户”,这将是所有普通员工登录应用程序的地方”(我决定采用模块化方式,因为我有一些应用程序需要类似的需求和模块化的东西我可以插入似乎很诱人。

我的问题:

我已经创建了用户模型,但是添加了一个自定义注册控制器,如下所示。

user_registrations_controller.rb

module Account
  class UserRegistrationsController < Devise::RegistrationsController

    private

    def sign_up_params
      params.require(:account_users).permit(:email, :password, :password_confirmation)
    end

    def account_update_params
      params.require(:account_users).permit(:email, :password, :password_confirmations, :current_password)
    end

  end
end 

用户模型如下

module Account
  class User < ActiveRecord::Base
    # Include default devise modules. Others available are:
    # :confirmable, :lockable, :timeoutable and :omniauthable
    devise :database_authenticatable, :registerable,
           :recoverable, :rememberable, :trackable, :validatable, :confirmable, :lockable
  end
end

当我尝试注册用户时,我在 Rails 服务器上得到的输出是:

Started POST "/account/users" for ::1 at 2016-04-25 00:49:12 -0600
Processing by Account::UserRegistrationsController#create as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"73uo7aB0DmS/rsZRuopEFvQ3MoTv1YJjdIRishvqEdY7Y2vcrIzwp6gfmUM3fApcDz2Fer5kFA/SjhNibZOGyw==", "user"=>{"email"=>"swilson@taurenltd.com", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]"}, "commit"=>"Sign up"}
Completed 400 Bad Request in 1ms (ActiveRecord: 0.0ms)

最后,这里是从更好的错误 gem 中截取的屏幕截图。

以及我的 rake 路由输出概览

                  Prefix Verb   URI Pattern                       Controller#Action
                 account        /account                          Account::Engine
        new_user_session GET    /users/sign_in(.:format)          devise/sessions#new
            user_session POST   /users/sign_in(.:format)          devise/sessions#create
    destroy_user_session DELETE /users/sign_out(.:format)         devise/sessions#destroy
           user_password POST   /users/password(.:format)         devise/passwords#create
       new_user_password GET    /users/password/new(.:format)     devise/passwords#new
      edit_user_password GET    /users/password/edit(.:format)    devise/passwords#edit
                         PATCH  /users/password(.:format)         devise/passwords#update
                         PUT    /users/password(.:format)         devise/passwords#update
cancel_user_registration GET    /users/cancel(.:format)           account/user_registrations#cancel
       user_registration POST   /users(.:format)                  account/user_registrations#create
   new_user_registration GET    /users/sign_up(.:format)          account/user_registrations#new
  edit_user_registration GET    /users/edit(.:format)             account/user_registrations#edit
                         PATCH  /users(.:format)                  account/user_registrations#update
                         PUT    /users(.:format)                  account/user_registrations#update
                         DELETE /users(.:format)                  account/user_registrations#destroy
       user_confirmation POST   /users/confirmation(.:format)     devise/confirmations#create
   new_user_confirmation GET    /users/confirmation/new(.:format) devise/confirmations#new
                         GET    /users/confirmation(.:format)     devise/confirmations#show
             user_unlock POST   /users/unlock(.:format)           devise/unlocks#create
         new_user_unlock GET    /users/unlock/new(.:format)       devise/unlocks#new
                         GET    /users/unlock(.:format)           devise/unlocks#show

Routes for Account::Engine:
        new_user_session GET    /users/sign_in(.:format)          devise/sessions#new
            user_session POST   /users/sign_in(.:format)          devise/sessions#create
    destroy_user_session DELETE /users/sign_out(.:format)         devise/sessions#destroy
           user_password POST   /users/password(.:format)         devise/passwords#create
       new_user_password GET    /users/password/new(.:format)     devise/passwords#new
      edit_user_password GET    /users/password/edit(.:format)    devise/passwords#edit
                         PATCH  /users/password(.:format)         devise/passwords#update
                         PUT    /users/password(.:format)         devise/passwords#update
cancel_user_registration GET    /users/cancel(.:format)           account/user_registrations#cancel
       user_registration POST   /users(.:format)                  account/user_registrations#create
   new_user_registration GET    /users/sign_up(.:format)          account/user_registrations#new
  edit_user_registration GET    /users/edit(.:format)             account/user_registrations#edit
                         PATCH  /users(.:format)                  account/user_registrations#update
                         PUT    /users(.:format)                  account/user_registrations#update
                         DELETE /users(.:format)                  account/user_registrations#destroy
       user_confirmation POST   /users/confirmation(.:format)     devise/confirmations#create
   new_user_confirmation GET    /users/confirmation/new(.:format) devise/confirmations#new
                         GET    /users/confirmation(.:format)     devise/confirmations#show
             user_unlock POST   /users/unlock(.:format)           devise/unlocks#create
         new_user_unlock GET    /users/unlock/new(.:format)       devise/unlocks#new
                         GET    /users/unlock(.:format)           devise/unlocks#show

我在这里很慌张.. 没有很多关于这类事情的文档。在此先感谢您的帮助!

EDIT #1 -- 添加 Routes .rb(引擎和应用程序相同)

  mount Account::Engine => "/account", as: 'account'

  devise_for :users,{
      class_name: "Account::User",
      module: :devise,
      controllers: { registrations: 'account/user_registrations' }
      }

添加注册新表单

注册

<%= form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f| %>
  <%= devise_error_messages! %>

  <div class="field">
    <%= f.label :email %><br />
    <%= f.email_field :email, autofocus: true %>
  </div>

  <div class="field">
    <%= f.label :password %>
    <% if @minimum_password_length %>
    <em>(<%= @minimum_password_length %> characters minimum)</em>
    <% end %><br />
    <%= f.password_field :password, autocomplete: "off" %>
  </div>

  <div class="field">
    <%= f.label :password_confirmation %><br />
    <%= f.password_field :password_confirmation, autocomplete: "off" %>
  </div>

  <div class="actions">
    <%= f.submit "Sign up" %>
  </div>
<% end %>

<%= render "users/shared/links" %>

编辑注册视图/表单

<h2>Edit <%= resource_name.to_s.humanize %></h2>

<%= form_for(resource, as: resource_name, url: registration_path(resource_name), html: { method: :put }) do |f| %>
  <%= devise_error_messages! %>

  <div class="field">
    <%= f.label :email %><br />
    <%= f.email_field :email, autofocus: true %>
  </div>

  <% if devise_mapping.confirmable? && resource.pending_reconfirmation? %>
    <div>Currently waiting confirmation for: <%= resource.unconfirmed_email %></div>
  <% end %>

  <div class="field">
    <%= f.label :password %> <i>(leave blank if you don't want to change it)</i><br />
    <%= f.password_field :password, autocomplete: "off" %>
  </div>

  <div class="field">
    <%= f.label :password_confirmation %><br />
    <%= f.password_field :password_confirmation, autocomplete: "off" %>
  </div>

  <div class="field">
    <%= f.label :current_password %> <i>(we need your current password to confirm your changes)</i><br />
    <%= f.password_field :current_password, autocomplete: "off" %>
  </div>

  <div class="actions">
    <%= f.submit "Update" %>
  </div>
<% end %>

【问题讨论】:

  • 您可以包含您的表单/视图代码吗?
  • 可以,完全没有修改过。
  • 按要求添加

标签: ruby-on-rails ruby-on-rails-4 devise rails-engines


【解决方案1】:

查看发送到控制器的参数:

{"utf8"=>"✓", "authenticity_token"=>"73uo7aB0DmS/rsZRuopEFvQ3MoTv1YJjdIRishvqEdY7Y2vcrIzwp6gfmUM3fApcDz2Fer5kFA/SjhNibZOGyw==", "user"=>{"email"=>"swilson@taurenltd.com", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]"}, "commit"=>"Sign up"}

表单将参数发送为user,因为这是在设计视图中定义的resourceresource_name

所以相关的哈希键是:user 而不是:account_users。以下更改应该可以解决此问题:

params.require(:user).permit(...)

或者,您可以覆盖 form_for 中的参数名称:

form_for resource, as: 'account_user' do |f|
  ....

如果您走这条路,您可能希望使用 account_user 而不是 account_users,因为您正在创建/更新单个资源,而不是集合。

【讨论】:

  • 没有问题,祝你好运!
猜你喜欢
  • 2014-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多