Rails 5, phương thức không xác định `for 'for # <Devise on line devise_parameter_sanitizer.for


95

Tôi đang làm việc với Rails 5

Tôi đã gắn tên người dùng trường mới trong Người dùng mô hình.

class Users::RegistrationsController < Devise::RegistrationsController
  before_action :configure_permitted_parameters

  protected

  def configure_permitted_parameters
    devise_parameter_sanitizer.for(:sign_up).push(:username)  
  end
end

Trong quá trình đăng ký, lỗi hiển thị: phương thức không xác định `for 'cho # Ý bạn là? cái nĩa

Dấu vết:

NoMethodError (phương thức không xác định `cho 'cho # Ý bạn là? Fork):

app/controllers/users/registrations_controller.rb:7:in `configure_permitted_parameters'
  Rendering /usr/local/rvm/gems/ruby-2.3.0/gems/actionpack-5.0.0.rc1/lib/action_dispatch/middleware/templates/rescues/diagnostics.html.erb within rescues/layout
  Rendering /usr/local/rvm/gems/ruby-2.3.0/gems/actionpack-5.0.0.rc1/lib/action_dispatch/middleware/templates/rescues/_source.html.erb
  Rendered /usr/local/rvm/gems/ruby-2.3.0/gems/actionpack-5.0.0.rc1/lib/action_dispatch/middleware/templates/rescues/_source.html.erb (5.0ms)
  Rendering /usr/local/rvm/gems/ruby-2.3.0/gems/actionpack-5.0.0.rc1/lib/action_dispatch/middleware/templates/rescues/_trace.html.erb
  Rendered /usr/local/rvm/gems/ruby-2.3.0/gems/actionpack-5.0.0.rc1/lib/action_dispatch/middleware/templates/rescues/_trace.html.erb (2.9ms)
  Rendering /usr/local/rvm/gems/ruby-2.3.0/gems/actionpack-5.0.0.rc1/lib/action_dispatch/middleware/templates/rescues/_request_and_response.html.erb
  Rendered /usr/local/rvm/gems/ruby-2.3.0/gems/actionpack-5.0.0.rc1/lib/action_dispatch/middleware/templates/rescues/_request_and_response.html.erb (1.2ms)
  Rendered /usr/local/rvm/gems/ruby-2.3.0/gems/actionpack-5.0.0.rc1/lib/action_dispatch/middleware/templates/rescues/diagnostics.html.erb within rescues/layout (118.1ms)

Ai có thể giúp? Làm thế nào để giải quyết vấn đề này?


1
Nó cũng xảy ra trên Rails 4.2.
sekrett

Câu trả lời:


173

According to the documentation:

API thông số vệ sinh đã thay đổi cho Devise 4

class ApplicationController < ActionController::Base
  before_action :configure_permitted_parameters, if: :devise_controller?

  protected

  def configure_permitted_parameters
    devise_parameter_sanitizer.permit(:sign_up, keys: [:username])
  end
end

đối với một số lý do công trình này nhưng khi tôi khởi động lại đường ray nó ngừng hoạt động một lần nữa
K2xL

@ K2xL Xóa thùng rác của bạn? Rất tiếc, tháng 10 của nó. Bạn đã khắc phục điều này như thế nào?
snowYetis,

dừng + khởi động lại mùa xuân, có thể
phillyslick

1
Cảm ơn! Đối với những người không muốn cập nhật mã của họ, bạn có thể điều chỉnh Gemfile của mình cho phù hợp - đã gem 'devise', '~> 3'sắp xếp nó cho tôi.
Darragh Enright

34

Nếu bạn chỉ cần thay đổi .forthành .permitnó hoạt động tốt. Ví dụ:

devise_parameter_sanitizer.permit(:sign_up) { |u| u.permit({ roles: [] }, :email, :password, :password_confirmation, :username) }

Nó hoạt động trên cả Rails 4.2.x và Rails 5.0.x


2

Đừng quên devise_parameter_sanitizer.permit(:account_update, keys: [:username])


1
Anh ta không quên, anh ta cần chuyển sang cú pháp mới.
sekrett

0

Tôi nghĩ rằng bạn đã bỏ lỡ account_update trong phương thức config_permiss_parameters của bộ điều khiển, bạn cần làm theo mẫu devise. Devise có một trang cập nhật tài khoản. Bạn có thể tìm thấy điều này trong views / devise / register / edit.html.erb và mã của bạn cũng sẽ không hoạt động trong trang sign_up, tại đây bạn đã chỉ định trang sign_up

Để cập nhật bảng người dùng của bạn, thời điểm bạn gửi bản cập nhật trong người dùng / chỉnh sửa của mình hoặc nếu bạn đang gửi tên người dùng trong trang đăng ký, bạn cần làm theo mẫu phát minh này, để cập nhật cơ sở dữ liệu Bảng người dùng. Ngay cả khi bạn đã thêm một cột mới vào bảng người dùng, bạn sẽ phải thêm nó vào phương thức config_permiss_parameters. Trong trường hợp của bạn, đó là tên người dùng, nhưng bạn cũng bỏ lỡ account_update. Về cơ bản, bạn đang nói rằng bạn muốn cập nhật tên người dùng hoặc thêm chuỗi vào trường tên người dùng mà không cần tuân theo mẫu Devise. Bất kỳ trường nào bạn thêm vào bảng Người dùng phải tuân theo mẫu Devise này. Ngoài ra, bạn có thể chỉ định trang nào được phép cập nhật tên người dùng này. Trong ví dụ của tôi dưới đây, tôi đang sử dụng trang cập nhật dành cho nhà phát triển. Vì vậy, như tôi đã nói, ngay cả khi bạn đã thêm tên trường tùy chỉnh vào bảng Người dùng, bạn cần phải tuân theo mẫu này.

class ApplicationController < ActionController::Base
  before_action :configure_permitted_parameters, if: :devise_controller?

  protected

  def configure_permitted_parameters
    devise_parameter_sanitizer.permit(:sign_up, keys: [:username])
    devise_parameter_sanitizer.permit(:account_update, keys: [:username])
  end
end

Tiếp theo, hãy đảm bảo rằng trong user.rb của bạn, bạn có xác thực tên người dùng trong mô hình Người dùng của mình.

class User < ApplicationRecord
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :validatable

  validates :username, presence: true
end

-1
class ApplicationController < ActionController::Base

  before_action :configure_permitted_paramters, if: :devise_controller?

  protected
    def configure_permitted_paramters

        devise_parameter_sanitizer.permit(:sign_up, keys: [:fullname])

        devise_parameter_sanitizer.permit(:account_update, keys: [:fullname, 
        :phone_number, :description, :email, :password])

    end

end
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.