如何为 params.permit 设置默认值

Vik*_*tor 2 ruby-on-rails-4

我想为我允许的参数之一设置默认值。

我试着像他们说的那样做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
Run Code Online (Sandbox Code Playgroud)

但它似乎没有用——ActiveModel::ForbiddenAttributesError (ActiveModel::ForbiddenAttributesError)因为这部分,我得到了:

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

我应该如何设置我的默认值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
Run Code Online (Sandbox Code Playgroud)

模型/用户.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+\-.]+@[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
Run Code Online (Sandbox Code Playgroud)

xle*_*ras 10

您可以利用这样一个事实,即permit的输出可以作为散列处理,只需使用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
Run Code Online (Sandbox Code Playgroud)