-1

There is a mass assignment defined in sys_log model in our rails 3.1.4 app:

attr_accessible :log_date, :user_name, :user_id, :user_ip, :action_logged, :as => :new_log

A method is defined in application_controller to save the log:

  def sys_logger(action_logged)
    log = SysLog.new(:log_date => Time.now, :user_id => session[:user_id], :user_name => session[:user_name], :user_ip => session[:user_ip],
                     :action_logged => action_logged, :as => :new_log)
    log.save
  end

However, the mass assignment does not work. Here is the warning message:

WARNING: Can't mass-assign protected attributes: log_date, user_id, user_name, 
user_ip, action_logged, as

:new_log is not working as defined. What's wrong with the code above? Thanks so much.

user938363
  • 9,990
  • 38
  • 137
  • 303
  • I am going to guess looking up that warning message would yield useful results ... –  May 30 '12 at 04:20

1 Answers1

1

The :as => :new_log is now part of the hash of attributes, instead of a separate option you pass in.

Adding some curly braces should help:

def sys_logger(action_logged)
  log = SysLog.new({:log_date => Time.now, :user_id => session[:user_id],
                    :user_name => session[:user_name], :user_ip => session[:user_ip], 
                    :action_logged => action_logged }, :as => :new_log)
  log.save
end

Or assigning it temporarily:

def sys_logger(action_logged)
  attrs = { :log_date => Time.now, :user_id => session[:user_id],
            :user_name => session[:user_name], :user_ip => session[:user_ip],
            :action_logged => action_logged }
  log = SysLog.new(attrs, :as => :new_log)
  log.save
end
iain
  • 16,204
  • 4
  • 37
  • 41
  • Works like charm. Thanks. What we have missed is ruby hash should be with braces. Or as a var like the params[:model_name] used in controllers mass assignment. Thanks again. – user938363 May 30 '12 at 14:30