ActiveModel :: MassAssignmentSecurity :: SubjectsController中的错误#create

时间:2012-09-24 02:04:53

标签: ruby-on-rails

Can't mass-assign protected attributes: created_at(2i), created_at(3i), created_at(1i), created_at(4i), created_at(5i)

我的代码如下:

def new
  @subject = Subject.new(:name => 'default')
  @subject_count = Subject.count + 1
end

def create
  # Instantiate a new object using form parameters
  @subject = Subject.new(params[:subject])
  # Save the object
  if @subject.save
  # If save succeeds, redirect to the list action
    flash[:notice] = "Subject created."
    redirect_to(:action => 'list')
  else
  # If save fails, redisplay the form so user can fix problems
    @subject_count = Subject.count + 1
    render('new')

问题是什么?

3 个答案:

答案 0 :(得分:2)

你可以试试这个,
在您的主题模型中添加您在表单中使用的所有属性,例如

class Subject < ActiveRecord::Base
  attr_accessible :name, :created_at
  ...
  ...
end

答案 1 :(得分:0)

使用attr_accessible将应用程序中的config.active_record.whitelist_attributes设置为application.rb(不推荐)中的false或模型中的白名单属性     attr_accessible:name,:etc ......

答案 2 :(得分:0)

确保按照Alex解释的Subject模型中通过控制器发送的属性列入白名单。主题模型应如下所示:

class Subject < ActiveRecord::Base
  attr_accessible :created_at
end

为什么呢? Rails最近要求(在security problem on Github之后)以确保恶意用户不从前端发送不需要的属性。假设您在User类上有一个:admin boolean字段。如果没有attr_accessible,有人可以在表单中添加一个新字段,例如<input type="checkbox" name="user[admin]" value="true" checked>,这将为您的应用程序提供管理员权限。

Sidenote ...您无需在HTML表单中设置:created_at日期,ActiveRecord将自动为您管理:created_at:updated_at(除非您想手动设置它)当然有些原因。)