2015-11-06 5 views
1

Я хочу установить значение по умолчанию для одного из моих разрешенных параметров.Как установить значение по умолчанию для params.permit

я пытался сделать, как они сказали http://api.rubyonrails.org/classes/ActionController/Parameters.html

class UsersController < ApplicationController 

    def new 
    @user = User.new 
    end 

    def show 
    @user = current_user 
    end 

    def create 
    user_params = ActionController::Parameters.new({ 
                 user: { 
                  avatar_link: '/assets/avatar-placeholder.png' 
                } 
               }) 
    @user = User.new(user_params) 
    if @user.save 
     session[:user_id] = @user.id 
     redirect_to user_path(current_user) 
    else 
     redirect_to new_user_path 
    end 
    end 

    private 

    def user_params 
    params.require(:user).permit(:name, :username, :email, :password, :password_confirmation, :avatar_link) 
    end 
end 

Но это, кажется, не работает - я получаю ActiveModel::ForbiddenAttributesError (ActiveModel::ForbiddenAttributesError) из-за этой части:

user_params = ActionController::Parameters.new({ 
               user: { 
                avatar_link: '/assets/avatar-placeholder.png' 
               } 
              }) 

Как я должен установить значение по умолчанию для моего params?

UPD: Я пытался использовать @xlembouras решение, но теперь у меня есть rollback transaction

def user_params 
    defaults = {avatar_link: '/assets/avatar-placeholder.png'} 
    params.require(:user).permit(:name, :username, :email, :password, :password_confirmation, :avatar_link).reverse_merge!(defaults) 
    puts params 
end 

модели/user.rb

class User < ActiveRecord::Base 
    before_save { self.email = email.downcase } 
    has_secure_password 
    validates_confirmation_of :password 
    has_many :projects 

    validates :name, presence: true, length: {maximum: 50} 
    validates :username, presence: true, uniqueness: { case_sensitive: false }, length: {maximum: 50} 
    VALID_EMAIL_REGEX = /\A[\w+\-.][email protected][a-z\d\-.]+\.[a-z]+\z/i 
    validates :email, presence: true, format: {with: VALID_EMAIL_REGEX}, uniqueness: { case_sensitive: false } 
    validates :password, presence: true, length: {minimum: 6} 
    validates :password_confirmation, presence: true 
end 
+1

что такое e rrors, которые вызывают откат? вы также должны предоставить часть проверки 'User' – xlembouras

+0

@xlembouras. Это на самом деле просто« откат транзакции »на консоли, не более того. – Viktor

+1

Откат является результатом ошибки, либо в модели, либо на вашем дБ. вы можете добавить '@ user.valid ?; ставит @ user.errors' перед сохранением или устанавливает отладчик и видит, что происходит. – xlembouras

ответ

2

вы можете воспользоваться тем, что permit " s можно обрабатывать как хэш и использовать только reverse_merge

def create 
    user = User.new(user_params) 
    ... 
end 

private 

def user_params 
    defaults = { name: 'A name' } 
    params.require(:user).permit(:name, :username, :email, 
           :password, :password_confirmation, 
           :avatar_link).reverse_merge(defaults) 
end 
+0

Теперь я получаю 'rollback transaction' – Viktor

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