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?

Author: Vertexwahn, 2013-06-27

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
 374
Author: Domon,
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:

CanCanCan

 63
Author: mjnissim,
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.

 23
Author: Wilker Lucio,
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
 19
Author: StuR,
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):

  1. create_params
  2. <model_name>_params takie jak article_params (to domyślna Konwencja w rails do nazwania metody param)
  3. 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

 9
Author: Andreas,
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.

 3
Author: Brian Dear,
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

 -1
Author: Dipen Patel,
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