我正在使用Rails 4进行敏捷Web开发。第9章购物车9购物车创建。当我想更新购物车时,我收到以下错误通知:分配属性时,必须传递散列作为参数。 CartController#更新。
class CartsController < ApplicationController
include CurrentCart
before_action :set_cart, only: [:show, :edit, :update, :destroy]
rescue_from ActiveRecord::RecordNotFound, with: :invalid_cart
def index
@carts = Cart.all
end
def show
end
def new
@cart = Cart.new
end
def edit
end
def create
@cart = Cart.new(cart_params)
respond_to do |format|
if @cart.save
format.html { redirect_to @cart, notice: 'Cart was successfully created.' }
format.json { render :show, status: :created, location: @cart }
else
format.html { render :new }
format.json { render json: @cart.errors, status: :unprocessable_entity }
end
end
end
def update
@cart = Cart.find(params[:id])
respond_to do |format|
if @cart.update_attributes(params[:cart])
format.html { redirect_to @cart, notice: 'Cart was successfully updated.' }
format.json { render :show, status: :ok, location: @cart }
else
format.html { render :edit }
format.json { render json: @cart.errors, status: :unprocessable_entity }
end
end
end
def destroy
@cart.destroy if @cart.id == session[:card_id]
session[:card_id] = nil
respond_to do |format|
format.html { redirect_to store_url, notice: 'Your cart is currently empty.' }
format.json { head :no_content }
end
end
private
def set_cart
@cart = Cart.find(params[:id])
end
def cart_params
params[:cart]
end
def invalid_cart
logger.error "Attempt to access invalid cart #{params[:id]}"
redirect_to store_url, notice: 'Invalid cart'
end
end
答案 0 :(得分:10)
您的参数可能是ActionController::Parameters
的一个实例如果是这样,您需要允许使用您想要使用的属性,如下所示:
def cart_params
params.require(:cart).permit(:attribute1, :attribute2, :attribute3)
end
答案 1 :(得分:4)
试试这个: 在您的更新方法中替换
if @cart.update_attributes(params[:cart])
通过
if @cart.update_attributes(cart_params)
在你的cart_params私有方法中执行以下操作:
def cart_params
params.require(:cart).permit(:attribute1, :attribute2, :attribute3)
end
使用Rails 4,引入了强参数的概念,它基本上禁止在控制器中对属性进行质量分配。这意味着曾经在模型中的质量分配保护(attr_accessible)现在已经移动到控制器。因此,在您的模型中,不再需要使用此功能:
attr_accessible :attribute1, attribute 2 #attributes that can be mass-assinged
attr_protected :attribute3 #attribute that is protected and cannot be mass-assinged
相反,您现在可以通过以下方式在控制器中执行此操作:
params.require(:cart).permit(:attribute1, :attribute2, :attribute3)
这意味着只有attribute1,attribute2。购物车的attribute3可以访问,而其他属于受保护的属性