Rails CRUD Parameter Ausgabe
-
21-08-2019 - |
Frage
Also mein Hintergrund ist in Java Web Service, aber ich versuche, den Umzug zu ROR zu machen.
Ich bin mit FlexImage Bild-Upload und Thumbnail-Generation zu behandeln. Ich folgte den Führer und CRUD Verhalten arbeitet an einem Punkt in Ordnung. Aber an einem gewissen Punkt, CRUD Verhalten für einen meiner Modelle (Bilder) war gebrochen.
Der Fehlercode Ich bin immer wieder, wie folgt: ActiveRecord::RecordNotFound in ImagesController#show -- Couldn't find Image with ID=#<Image:0x4e2bd74>.
Mit anderen Worten, wenn ich Rails sage erstellen / aktualisieren / zerstören, es ist verwirrend, das Objekt mit dem id. Dies scheint zu zeigen, könnte es ein Routing-Problem sein. Ich dachte, eine teilweise für das Hinzufügen von Bildern haben könnte das Problem gewesen, aber die Änderungen zurück haben es nicht reparieren.
Im Folgenden werden die neuen, Show und Aktualisierungsmethoden des Controllers für die Bilder Modell:
# images_controller.rb
# ...
def new
@image = Image.new
respond_to do |format|
format.html # new.html.erb
format.xml { render :xml => @image }
end
end
# ...
def show
@image = Image.find(params[:id])
respond_to do |format|
format.jpg # show.jpg.erb
format.html # show.html.erb
format.xml { render :xml => @image }
end
end
# ...
def create
@image = Image.new(params[:image])
if @image.save
redirect_to image_url(@image)
else
flash[:notice] = 'Your image did not pass validation.'
render :action => 'new'
end
end
# ...
Beachten Sie, dass Show () ist, natürlich, eine entsprechende ID zu erwarten. Hier ist die new.html.erb für ein neues Bild hochgeladen werden:
# new.html.erb [upload image]
<h1>New image</h1>
<% form_for @image, :html => { :multipart => true } do |f| %>
<%= f.error_messages %>
<table><tr><td width="50%">
<p>
<%= f.label :filename %><br />
<%= f.text_field :filename %></p>
</td>
<td><p><b>Upload Image</b><br />
<%= f.file_field :image_file %><br />
or URL: <%= f.text_field :image_file_url %>
<%= f.hidden_field :image_file_temp %>
</td>
<td>
<b>Uploaded Image:</b><br />
<%= embedded_image_tag(@image.operate { |img| img.resize 100 }) if @image.has_image? %>
</td>
</tr>
</table>
<p>
<%= f.label :description %><br />
<%= f.text_area :description %>
</p>
<p>
<%= f.submit 'Create' %>
</p>
<% end %>
<%= link_to 'Back', images_path %>
Der relevante Teil der routes.rb ist wie folgt:
# routes.rb [excerpt]
map.resources :images
map.image 'images/:action/:id.:format', :controller => 'images'
Beachten Sie auch, dass ein neues Bild hat tatsächlich hochgeladen erhält und der Fehler auf Umleitung ausgelöst wird, zeigen (die eine gültige ID in params erwartet [: id] und nicht das Objekt, das aus irgendeinem Grunde es wird übergeben werden.)
Vielen Dank für Ihre Hilfe im Voraus, und lassen Sie es mich wissen, wenn etwas auf Sie springt aus.
Lösung
Von Blick auf dem Code scheint es mir, dass das Problem durch die Verwendung image_url(@image)
in Kombination mit der nicht-RESTful image
Route verursacht werden kann.
Sie werden wahrscheinlich wollen die Zeile entfernen
map.image 'images/:action/:id.:format', :controller => 'images'
von Ihrem routes.rb
.
Die Zeile
map.resources :images
sollte eigentlich genug sein, um alle CRUD Aktionen in Ihrem ImagesController
aussetzen.
Andere Tipps
Mein Vorschlag ist, ruby-debug zu verwenden und eine Bruchstelle direkt vor dem Image.find Rufaufbau. Überprüfen Sie params [: id] und sehen, was es tatsächlich ist.
Ein Ghetto Ansatz, setzt diese vor dem Image.find Aufruf
logger.info params[:id].class
und sehen, was in diesen Variablen ist. Ist es möglich, dass Sie irgendeine Art von vor-Filter haben, die es manipuliert?
Versuch
redirect_to :action => "show", :id => @image
Ich denke, das ist ein mehr idiomatischer Weg, um die Umleitung zu codieren. Und +1 bis MOLF Rat über RESTful Routen.