2017-03-12 6 views
0

Also versuche ich jedes Mal eine neue "Transaktion" zu erstellen, wenn ich auf den Button "Kaufen" klicke, aber scheint nicht zu funktionieren. Ich bekomme den Fehler "undefined Methode` [] 'für nil: NilClass ".Wie man einen Knopf benutzt, um in Schienen zu setzen?

<% @comics.each do |comic|%> 
    <ul> 
    <li><%= comic.title %> </li> 
    <li><%= comic.author %> </li> 
    <li><%= comic.year %> </li> 
    <li><%= comic.publisher %> </li> 
    <% if user_signed_in? %> 
    <%= button_to 'Purchase', {:controller => "transactions", :action => "create", :seller_id => comic.user_id, :buyer_id=> current_user.id, :comic_id => comic.id} , {:method=>:post} %> 
    <% end %> 
</ul> 

Dies ist, was Sie in den Transaktionen Controller finden:

def create 
    @my_transaction = Transaction.new(
     buyer_id: params[:transaction][:buyer_id], 
     seller_id: params[:transaction][:seller_id], 
     comic_id: params[:transaction][:comic_id] 
    ) 
    @my_transaction.save 
     redirect_to "/transactions/" 
    end 

Haben Sie eine Idee haben, warum dies passiert sein könnte?

Danke!

Antwort

1

Es gibt ein paar Möglichkeiten, dies debuggen können:

  1. Blick in die Konsolenprotokolle, um zu sehen, was im params-Hash geschrieben wird.
  2. Fügen Sie eine puts-Anweisung am Anfang der create-Anweisung hinzu, um zu sehen, was in der Variablen params steht, z.

Controller

def create 
    puts params.inspect 
end 

ich Sie finden vermuten werden, dass die params-Hash keinen transaction Schlüssel hat und das Verfahren sollte

def create 
    @my_transaction = Transaction.new(
    buyer_id: params[:buyer_id], 
    seller_id: params[:seller_id], 
    comic_id: params[:comic_id] 
) 
end 
+0

Vielen Dank im Weg Helfer gebaut nutzen! Es war genau das! Arbeitete wie ein Charme :) – Aradeea

+0

NP, wenn meine Antwort half, bitte akzeptieren Sie es, indem Sie auf das Häkchen unter der Nummer klicken – margo

1

sein schaffen Die params[:transaction] Null ist, können Sie sehen Sie die gesendeten Parameter im Protokoll (tail -f log/development.log, wenn der Server nicht protokolliert). In Ihrem Fall Zugriff auf die benötigten Daten wie params[:comic_id]

Ein paar Tipps:

niemals der Eingabe vom Client kommenden vertrauen: :buyer_id=> current_user.id hier ein Angreifer beliebige ID schicken könnte, da die button_to Helfer ein HTML-Formular erstellen werden die ist mit dem devtool leicht erreichbar. Überprüfen Sie es stattdessen auf der Serverseite. Dasselbe gilt für die seller_id, Sie können einfach den zugehörigen Comic comic = Comic.find params[:comic_id] abrufen.

Sie könnten einen anderen API-Ansatz wie POST /comics/1/buy das ist ein bisschen mehr restfull betrachten wollen, und Sie könnten die für diese URL wie buy_comic_path(comic)

Verwandte Themen