Ruby on rails ActiveModel::MassAssignmentSecurity::错误,即使在为

Ruby on rails ActiveModel::MassAssignmentSecurity::错误,即使在为,ruby-on-rails,ruby-on-rails-3,Ruby On Rails,Ruby On Rails 3,我的完整错误消息是: ActiveModel::MassAssignmentSecurity::中的错误 WorkoutsController#创建无法批量分配受保护的属性: 运动项目 我正在发送的参数如下所示: {"workout"=>{"unit"=>"kg", "name"=>"2013-02-20T21:26:19", "note"=>nil, "workout_entry"=> [{"workout_entry_number"=>"1", "exer

我的完整错误消息是:

ActiveModel::MassAssignmentSecurity::中的错误 WorkoutsController#创建无法批量分配受保护的属性: 运动项目

我正在发送的参数如下所示:

{"workout"=>{"unit"=>"kg", "name"=>"2013-02-20T21:26:19", "note"=>nil, "workout_entry"=> [{"workout_entry_number"=>"1", "exercise_id"=>2, "entry_detail"=>[{"set_number"=>"1", "weight"=>"32", "reps"=>"43"}]}]}}
我有一个包含许多训练条目的训练,每个训练条目都可以包含许多条目详细信息。注释是可选的

workout.rb

class Workout < ActiveRecord::Base
    has_many :workout_entries, dependent: :destroy

    attr_accessible :id, :name, :note, :unit, :workout_entries_attributes
    belongs_to :user
    accepts_nested_attributes_for :workout_entries

    validates_presence_of :name
    validates_presence_of :unit, :inclusion => %w(kg lb)
    validates_associated :workout_entries

    default_scope order("created_at DESC")

end

但是创建仍然被阻止。

接受
的_嵌套_属性_不会将任何属性添加到白名单中。无论您试图传递什么键来更新属性,都必须在attr\u accessible中列出,在您的情况下,您需要将
workout\u entry
添加到
attr\u accessible


看起来表单中确实有错误,如果您使用字段,\u,则应使用键
训练\u条目\u属性
,您可以访问它。

尝试在您的训练模型中的attr ACCESS中添加训练输入ID。

我决定在训练和训练输入模型中不使用accepts\u nested\u attributes\u for,因为它不适用于我。我还更新了发送的json的格式。详情见下面的链接


错误在表单生成的参数中。你能在视图中包含必要的表单吗?我实际上是在使用ajax发送参数,所以我没有表单视图。哦,好的。那么您是在ajax中手动构建参数的?还是只是序列化了表单?如果手动构建,只需将“训练项目”替换为“训练项目”。还尝试将“训练项目”属性设置为“属性可访问”,但无效。我将json的格式更改为使用“训练项目属性”和“项目详细信息属性”,而不是“训练项目”和“项目详细信息”。这消除了大规模分配的问题,但我现在得到一个422状态代码。训练项目。训练项目id[“不能为空”,“不是数字”]训练项目[“无效”]训练、训练项目和项目详细信息似乎要同时创建。但是,我希望在创建任何其他内容之前先创建我的训练。我尝试将训练项添加到attr\u accessible,但仍然不起作用。
class WorkoutEntry < ActiveRecord::Base

    belongs_to :workout
    belongs_to :exercise
    has_many :entry_details, dependent: :destroy

    attr_accessible :workout_id, :exercise_id, :workout_entry_number, :entry_details_attributes
    accepts_nested_attributes_for :entry_details

    validates :exercise_id, presence: true, numericality: {only_integer: true}, :inclusion => { :in => 1..790 }
    validates :workout_id, presence: true, numericality: {only_integer: true, greater_than_or_equal_to: 1}
    validates :workout_entry_number, presence: true, numericality: {only_integer: true, greater_than_or_equal_to: 1}

end
class WorkoutsController < ApplicationController
    respond_to :json
    before_filter :authenticate_user!

    def index
        respond_with(current_user.workouts)
    end

    def show
        respond_with(current_user.workouts.find(params[:id]))
    end

    def create
        respond_with(current_user.workouts.create(params[:workout]))
    end

    def update
        @workout = current_user.workouts.find(params[:id])
        if @workout.update_attributes(params[:workout])
          render json: @workout, status: :ok
        else
          render json: @workout.errors, status: :unprocessable_entity
        end
    end

    def destroy
        respond_with(current_user.workouts.destroy(params[:id]))
    end

end
config.active_record.whitelist_attributes = true