0

我试图声明一些虚拟属性,这些属性将用于在给定日期时间的情况下将日期和时间组合在一起,尽管我不断收到以下错误。正如您从下面的代码示例中看到的那样,我如何设置属性,以及我传递给它们的信息。

ActiveModel::MassAssignmentSecurity::Error in SchedulesController#create

{"utf8"=>"✓",


"authenticity_token"=>"j4V6DAqK5U/+ZGaSKDlrEoOBqXu3pEq/FM51ingi2sg=",
 "schedule"=>{"event"=>"1",
 "result_id"=>"",
 "date"=>"04/11/2012",
 "arrival_time"=>"08:00 PM",
 "time"=>"08:00 PM",
 "duration"=>"1800",
 "location_id"=>"11",
 "selected_players"=>["",
 "41",
 "38"],
 "team_id"=>"1",
 "opponent_id"=>"1",
 "home_or_away"=>"Home"},
 "commit"=>"Save Event"}

控制器

    # POST /schedules
  # POST /schedules.json
  def create
    params[:schedule].delete(:date)
    params[:schedule].delete(:time)
    @user = User.find(current_user)

    @players = User.where(:team_id => current_user[:team_id]).all
    params[:schedule][:selected_players].compact
    #params[:schedule][:selected_players].reject!{|selected_players| selected_players==""}
    #@availabilities = @user.availabilities.create(:unique_id => params[:schedule][:id])

    @schedule = Schedule.new(params[:schedule])

    respond_to do |format|
      if @schedule.save
        #Notifier.event_added(@user,@schedule).deliver
        format.html { redirect_to(schedules_url,
                                  :notice => "#{event_display_c(@schedule.event)} vs #{@schedule.opponent.name} was successfully created.") }
        format.json { render :json => @schedule, :status => :created, :location => @schedule }
      else
        format.html { render :action => "new" }
        format.json { render :json => @schedule.errors, :status => :unprocessable_entity }
      end
    end
  end

模型

class Schedule < ActiveRecord::Base
  belongs_to :location
  belongs_to :opponent
  belongs_to :team
  belongs_to :result
  has_many :availabilities, :dependent => :destroy

  attr_accessible :location_id, :user_id, :opponent_id, :datetime, :score_for, :score_against, :event,
                  :team_id, :home_or_away, :arrival_time, :duration, :selected_players, :result_id

  attr_accessor :date, :time
4

3 回答 3

1

我相信您会收到 MassAssignmentSecurity 错误,因为您在实例化新计划时正在传递虚拟属性timedate进入Schedule.new,并且由于它们不在白名单属性列表中,Rails 假定它们是不应大量分配的属性。您应该在启动新计划之前删除它们params,然后(如果需要)直接设置相应的实例变量:

def create
  date = params[:schedule].delete(:date)
  time = params[:schedule].delete(:time)
  @schedule = Schedule.new(params[:schedule])
  @schedule.date = date
  @schedule.time = time
  ...

如果您想在模型保存时设置,您应该创建一个回调datetime来执行此操作(也许您已经拥有)。datetimebefore_save

于 2012-11-03T09:40:20.107 回答
0

检查无法访问的参数。然后这样做:

date = params[:schedule]
@schedule = Schedule.new(params[:schedule]) do |schedule|
  schedule.date = date
  ...
end

或者,您可以将批量分配规则设置为非严格:

config.active_record.mass_assignment_sanitizer = :logger

而不是有这些例外,过滤的属性将被记录下来。那么你可以这样做:

@schedule = Schedule.new(params[:schedule]) do |schedule|
  schedule = params[:schedule][:date]
  ...
end
于 2012-11-03T09:59:20.830 回答
0

自己想出来的,最后只是在数据库中添加了字段

于 2012-11-20T08:10:35.783 回答