0

StackOverlfowに関する以前のQ&Aに基づいて、application.rbに以下を追加しました。

 config.active_record.whitelist_attributes = false

タイプのエラーが発生したため、保護された属性を一括割り当てできません

それを行った後は、すべてが正常に機能しているように見えました。同じエラーが発生していますが、これはフォールスネガティブです。エラーが発生していても、実際には列が更新されていることに注意してください。

デバッガーの出力は次のとおりです。

Started PUT "/categories/5" for 127.0.0.1 at 2012-07-09 11:26:40 -0700
Processing by CategoriesController#update as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"SifcfX29c+mGRIJXvUWGnZ8mBelMm4uZloYsoO317SY=", "admin_selections"=>{"admin1"=>"56", "admin2"=>"55", "admin3"=>"", "admin4"=>"", "admin5"=>"", "admin6"=>"", "admin7"=>"", "admin8"=>""}, "category"=>{"update_admins_field"=>"1"}, "commit"=>"Update Category", "id"=>"5"}
  Category Load (0.2ms)  SELECT `categories`.* FROM `categories` WHERE `categories`.`id` = 5 LIMIT 1
   (0.1ms)  BEGIN
   (0.2ms)  UPDATE `categories` SET `admins` = '[\"56\",\"55\",\"\"]', `updated_at` = '2012-07-09 18:26:40' WHERE `categories`.`id` = 5
   (1.3ms)  COMMIT
   (0.1ms)  BEGIN
   (0.1ms)  ROLLBACK
Completed 500 Internal Server Error in 5ms

ActiveModel::MassAssignmentSecurity::Error (Can't mass-assign protected attributes: utf8, _method, authenticity_token, category, commit, action, controller, id):
  app/controllers/categories_controller.rb:74:in `block in update'
  app/controllers/categories_controller.rb:62:in `update'

MySQLコードが適切に生成されているように見えますが、ロールバックと500エラーが発生します。

これがcategories_controller.rbからの関連コードです:

def update
  @category = Category.find(params[:id])
  respond_to do |format| #this is line 62
    if params[:category][:update_admins_field]
      params['admins'] = return_admins_json (params)
      if @category.update_attribute(:admins,params['admins'])
        format.html { redirect_to @category, notice: 'Category was successfully updated.' } #line 66
        format.json { head :no_content }
      end
    else
      format.html { redirect_to @category, notice: 'Category was not successfully updated.' }
      format.json { head :no_content }
    end

    if @category.update_attributes(params)  #line 74
      format.html { redirect_to @category, notice: 'Category was successfully updated.' }
      format.json { head :no_content }
    else
      format.html { render action: "edit" }
      format.json { render json: @category.errors, status: :unprocessable_entity }
    end
  end
end  

なぜ74行目に到達するのですか?ユーザーは66行目でリダイレクトされるべきではありませんか?更新が行われたときにエラーが発生するのはなぜですか?

4

1 に答える 1

1

ホワイトリスト属性をtrueに設定し、セキュリティ上の理由から各モデルでattr_accessibleを使用する必要があります。これに関する情報は次のとおりです。

http://guides.rubyonrails.org/security.html#mass-assignment

また、上記のNiiruのコメントを読んでください。

編集:

あなたの制御フローでは、私はそれがあなたが望むことをしていないと思います。74行目に到達した場合、条件付きの場合はおそらく最初のパスを通過します

if params[:category][:update_admins_field]

そして、2番目に失敗した場合

if @category.update_attribute(:admins,params['admins'])

そして、if / else / endを終了し、まだリターンが呼び出されていないため、74行目まで続行しました。これを修正するには、次のようなものが必要だと思います。

if admin category
   if update admin
      return success
   else
      return failure
   end
else
   if update normal
      return success
   else
      return failure
   end
end
于 2012-07-09T19:15:14.650 に答える