ActiveModel:: ForbiddenAttributesError podczas tworzenia nowego użytkownika
Mam ten model w Ruby ale rzuca ActiveModel::ForbiddenAttributesError
class User < ActiveRecord::Base
attr_accessor :password
validates :username, :presence => true, :uniqueness => true, :length => {:in => 3..20}
VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
validates :email, presence: true, :uniqueness => true, format: { with: VALID_EMAIL_REGEX }
validates :password, :confirmation => true
validates_length_of :password, :in => 6..20, :on => :create
before_save :encrypt_password
after_save :clear_password
def encrypt_password
if password.present?
self.salt = BCrypt::Engine.generate_salt
self.encrypted_password= BCrypt::Engine.hash_secret(password, salt)
end
end
def clear_password
self.password = nil
end
end
Kiedy uruchamiam tę akcję
def create
@user = User.new(params[:user])
if @user.save
flash[:notice] = "You Signed up successfully"
flash[:color]= "valid"
else
flash[:notice] = "Form is invalid"
flash[:color]= "invalid"
end
render "new"
end
On ruby 1.9.3p194 (2012-04-20 revision 35410) [x86_64-linux]
.
Czy możesz mi powiedzieć, jak pozbyć się tego błędu lub ustanowić odpowiedni formularz rejestracji użytkownika?
7 answers
Chyba używasz Rails 4. Jeśli tak, wymagane parametry muszą być oznaczone jako wymagane.
Możesz chcieć to zrobić tak:
class UsersController < ApplicationController
def create
@user = User.new(user_params)
# ...
end
private
def user_params
params.require(:user).permit(:username, :email, :password, :salt, :encrypted_password)
end
end
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-27 06:21:16
Dla osób stosujących CanCan . Ludzie mogą tego doświadczyć, jeśli używają CanCan z Rails 4+. Spróbuj AntonTrapps raczej czyste rozwiązanie obejścia tutaj dopóki CanCan nie zostanie zaktualizowany:
W ApplicationController
:
before_filter do
resource = controller_name.singularize.to_sym
method = "#{resource}_params"
params[resource] &&= send(method) if respond_to?(method, true)
end
Oraz w kontrolerze zasobów (na przykład NoteController):
private
def note_params
params.require(:note).permit(:what, :ever)
end
Update:
Oto kontynuacja projektu CanCan o nazwie CanCanCan , który wygląda obiecujący:
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-19 01:12:23
Istnieje łatwiejszy sposób, aby w ogóle uniknąć silnych parametrów, wystarczy przekonwertować parametry na zwykły hash, jak:
unlocked_params = ActiveSupport::HashWithIndifferentAccess.new(params)
model.create!(unlocked_params)
To oczywiście pokonuje cel silnych parametrów, ale jeśli jesteś w sytuacji takiej jak moja (robię własne zarządzanie dozwolonymi paramami w innej części mojego systemu), to wykonasz zadanie.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-14 18:07:11
Jeśli używasz ActiveAdmin nie zapominaj, że w bloku rejestru modelu znajduje się również permit_params:
ActiveAdmin.register Api::V1::Person do
permit_params :name, :address, :etc
end
Te muszą być ustawione razem z tymi w kontrolerze:
def api_v1_person_params
params.require(:api_v1_person).permit(:name, :address, :etc)
end
W przeciwnym razie pojawi się błąd:
ActiveModel::ForbiddenAttributesError
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-26 17:55:40
Dla osób stosujących CanCanCan :
Otrzymasz ten błąd, jeśli CanCanCan nie może znaleźć poprawnej metody params.
Dla akcji :create
, CanCan spróbuje zainicjować nową instancję z sanitized input sprawdzając, czy kontroler odpowie na następujące metody (w kolejności):
create_params
-
<model_name>_params
takie jak article_params (to domyślna Konwencja w rails do nazwania metody param) -
resource_params
(ogólnie nazwaną metodę można określić w każdy kontroler)
Dodatkowo, load_and_authorize_resource
może teraz użyć opcji param_method
, aby określić niestandardową metodę w kontrolerze, która ma zostać uruchomiona w celu dezynfekcji danych wejściowych.
Możesz powiązać opcję param_method
z symbolem odpowiadającym nazwie metody, która zostanie wywołana:
class ArticlesController < ApplicationController
load_and_authorize_resource param_method: :my_sanitizer
def create
if @article.save
# hurray
else
render :new
end
end
private
def my_sanitizer
params.require(:article).permit(:name)
end
end
Źródło: https://github.com/CanCanCommunity/cancancan#strong-parameters
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-06 14:42:27
Alternatywnie możesz użyć Protected Attributes gem , jednak to nie wystarcza, aby wymagać silnych param. Jeśli jednak aktualizujesz starszą aplikację, Protected Attributes zapewnia łatwą ścieżkę uaktualniania do czasu, aż możesz zmienić attr_accessible na silne params.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-22 02:30:15
Witam w moim przypadku błąd jest naprawiony, ale uzyskanie pustego wyniku to baza danych.
def create
@worklog = Worklog.new(user_params)
@worklog.day = Date.today
@worklog.week = Date.today.strftime("%W").to_i
@worklog.author = User.current
@worklog.save
redirect_to worklogs_path()
end
def user_params
params.require(:worklog).permit(:utf8, :authenticity_token, {:worklog => [:typee, :do, :todo, :feel, :plan_done, :plan, :week_feel, :score, :good, :nogood]}, :commit)
}
Mój oryginalny plugin to https://github.com/IceskYsl/worklogs
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-11 16:42:53