2014-10-16 25 views
6

Postępuję zgodnie z Agile Web Development z Rails 4. Rozdział Koszyk 9 Tworzenie koszyka. Gdy chcę zaktualizować koszyk, otrzymuję następujące powiadomienie o błędzie: Przypisując atrybuty, musisz podać wartość mieszającą jako argumenty. Aktualizacja CartController #.Przypisując atrybuty, musisz przekazać skrót jako argument

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 
+1

jak wyglądają twoje 'params [: cart]'? Czy to nie jest haszysz? Czy możesz sprawdzić parametry i udostępnić wynik. –

+0

To, co wewnątrz Logfile. Rozpoczęty PATCH "/ wózki/32" dla 127.0.0.1 na 2014-10-17 21:10:24 +0200 Przetwarzanie przez CartsController # aktualizacja jako HTML Parametry: {"utf8" => "✓", "authenticity_token" = > "N/VxeEOEbfYQhhEcPqMnzUPZVLxZqecS4BwJjHivqi4 =", "commit" => "Aktualizuj koszyk", "id" => "32"} Ładowanie koszyka (0,1 ms) WYBIERZ "wózki". * Z "wózki" GDZIE "wózki". " id "=? LIMIT 1 [["identyfikator", 32]] (0,0 ms) rozpoczyna transakcję (0,1 ms) wycofanie transakcji Zakończono 500 Błąd wewnętrznego serwera w 2ms – Keeic

+0

ArgumentError (Przypisując atrybuty, musisz przekazać mieszanie jako argument.) : aplikacja/kontrolery/carts_controller.rb: 49: w "bloku w aktualizacji" aplikacja/kontrolery/carts_controller.rb: 47: w "aktualizacji" – Keeic

Odpowiedz

8

Twoje params jest prawdopodobnie instancją ActionController::Parameters

Jeśli tak, musisz zezwolić atrybuty, których chcesz używać, tak jak poniżej:

def cart_params 
    params.require(:cart).permit(:attribute1, :attribute2, :attribute3) 
end 
3

Spróbuj: W aktualizacją metoda zastępuje

if @cart.update_attributes(params[:cart]) 

przez

if @cart.update_attributes(cart_params) 

W swoim cart_params Metoda prywatna to zrobić:

def cart_params 
    params.require(:cart).permit(:attribute1, :attribute2, :attribute3) 
end 

Z Rails 4, pojęcie silnych parametrów został wprowadzony które zasadniczo zabrania masowej przypisanie atrybutów w kontrolerze. Oznacza to, że ochrona masy, która była kiedyś w modelu (attr_accessible) została teraz przeniesiona do kontrolera. Dlatego w swoich modelach ty nie więcej potrzeby korzystania z tego:

attr_accessible :attribute1, attribute 2 #attributes that can be mass-assinged 
attr_protected :attribute3 #attribute that is protected and cannot be mass-assinged 

Zamiast tego można teraz zrobić to w kontrolerze poprzez:

params.require(:cart).permit(:attribute1, :attribute2, :attribute3) 

Oznacza to, że tylko atrybut1, atrybut2. atrybut3 koszyka są dostępne, a inne są chronione atrybutami

Powiązane problemy