1

Я использую Rails 4.0.2, Ruby 2.0.0p353Rails Strong Параметры ActiveModel :: ForbiddenAttributesError не отображается

Я пытаюсь использовать сильные параметры в моем проекте Rails, но я не могу получить ActiveModel :: ForbiddenAttributesError появится.

Если есть параметры не разрешены, эти параметры будут установлены в 0 или 0, но я думал, что должна появиться ошибка ActiveModel :: ForbiddenAttributesError. Таким образом, параметры, которые не разрешены сильными параметрами, будут переданы в мою модель User как nil или 0, и это проблема для меня.

Ниже следующий мой UsersController:

class UsersController < ApplicationController 

    def new 
    @user = User.new 
    end 

    def create 
    @user = User.new(user_params) 

    if @user.save 
     sign_in @user 
     flash[:notice] = "Welcome to the league!" 
     redirect_to root_url 
    else 
     render 'new' 
    end 
    end 

    private 
    def user_params 
     params.require(:user).permit(:first_name, :last_name, :alias, 
            :email, :password, :password_confirmation) 
    end 
end 

Вот является форма подписки пользователя с помощью, simple_form 3.0.1, new.html.erb:

<%= simple_form_for(@user) do |f| %> 

    <h1>Sign Up</h1> 

    <%= f.input :first_name %> 
    <%= f.input :last_name %> 
    <%= f.input :alias %> 
    <%= f.input :email %> 
    <%= f.input :password %> 
    <%= f.input :password_confirmation %> 
    <%= f.button :submit, class: "btn-lg btn-primary" %> 
<% end %> 

И вот подтверждение для моей модели пользователя user.rb:

class User < ActiveRecord::Base 

    ... 

    # Validations 
    validates :first_name, presence: true, length: { maximum: MAX_LENGTH_FIRST_NAME } 
    validates :last_name, presence: true, length: { maximum: MAX_LENGTH_LAST_NAME } 
    validates :alias, presence: true 
    validates :email, presence: true, 
        format: { with: VALID_EMAIL_REGEX }, 
        uniqueness: { case_sensitive: false } 
    has_secure_password 
    validates :password, length: { minimum: MIN_LENGTH_PASSWORD } 

    ... 

end 

Теперь давайте скажем, что я удалить: псевдоним из user_params так:

private 
    def user_params 
     params.require(:user).permit(:first_name, :last_name, 
            :email, :password, :password_confirmation) 
    end 

В моем понимании, если есть: псевдоним хэш (или любой другой хэш) в моем: пользователе Params, то я должен получить представление ActiveModel :: ForbiddenAttributesError.

Так что я пробовал удалить: псевдоним из user_params и , сохраняя псевдоним на пользовательской форме регистрации, чтобы у меня было: alias в user_params, чтобы поднять ошибку. Для того, чтобы держать его на моей форме и быть в состоянии представить его, я должен был прокомментировать мою проверку псевдонима в моей модели, чтобы выглядеть примерно так:

# validates :alias, presence: true 

Но когда я создаю новый пользователь со всеми полями, включая псевдоним, Ошибка не появляется. Вместо этого я создаю нового пользователя в базе данных со всей информацией, но атрибут псевдонима nil независимо от того, что я ввел в форму.

Если бы кто-нибудь мог сказать мне, как иметь unpermitted params повысить исключение, пожалуйста, дайте мне знать.

Заранее спасибо.

* EDIT *

Причина, почему я отправил это было на самом деле в течение update_attributes().

Моя проблема заключалась в том, что я пытался обновить только 3 (из 5) атрибутов пользователя. Я попытался сделать сильные параметры, чтобы убедиться, что обновлены только эти 3 атрибута и ничего больше, но я думаю, что это неправильный способ сделать это.

Еще раз спасибо Брайану за разъяснение об ошибке и том, как она действительно поднята.

+0

хороший первый вопрос – basher

ответ

0

Nope, ActiveModel::ForbiddenAttributesError только поднимается, если вы передаете неактифицированные объекты на вызов обновления записи.

@user.update_attributes(params[:user]) # This would be an issue 

User.where(params[:user]) # This would not 

@user.update_attributes(user_params) # Neither would this 

def user_params 
    params.require(:user).permit(:name) 
end 

Это может быть на самом деле вид боли, потому что, если вы забыли явно включить атрибут, скажем, после миграции БД, это может быть скрытая ошибка.

Судя по этому сниппета из the documentation

params = ActionController::Parameters.new(user: { name: 'Francesco', age: 22, role: 'admin' }) 
permitted = params.require(:user).permit(:name, :age) 
permitted.permitted?  # => true 
permitted.has_key?(:name) # => true 
permitted.has_key?(:age) # => true 
permitted.has_key?(:role) # => false 

Если вы действительно хотите исключение вы могли бы просто написать

ActionController::Parameters.action_on_unpermitted_parameters = :raise 
+0

Спасибо за быстрый ответ Brian! Реальная проблема связана с вызовом update_attributes. Я не думал, что это повлияет на save и update_attributes, так как у меня такая же проблема в обоих сценариях. Не могли бы вы рассказать немного больше о разнице между @ user.update_attributes (PARAMS [: пользователя]) # Это будет проблемой и @ user.update_attributes (user_params) # Не будет это –

+0

Взгляните последней строкой кода, этот параметр конфигурации должен позволять поднимать ошибки всякий раз, когда передается непредвиденный параметр. Это то, что вы хотели? – OneChillDude

+0

Хорошо, вы объяснили, что происходит со мной очень четко. Моя проблема заключалась в том, что я пытался обновить только 3 (из 5) атрибутов пользователя. Я попытался сделать сильные параметры, чтобы убедиться, что обновлены только эти 3 атрибута и ничего больше, но я думаю, что это неправильный способ сделать это. Я постараюсь задать еще один вопрос для этого. Еще раз спасибо за вашу помощь Брайан. Я очень ценю это. –

Смежные вопросы