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

time仮想属性を渡して新しいスケジュールをインスタンス化dateするときにMassAssignmentSecurityエラーが発生していると思います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 に答える