Rails CRUD Paramètres Problème
-
21-08-2019 - |
Question
Donc, mon arrière-plan est dans les services Web Java, mais je suis en train de faire la transition vers ROR.
J'utilise Fleximage pour gérer et téléchargement d'images génération de vignettes. J'ai suivi le guide et le comportement CRUD fonctionnait très bien à un moment donné. Cependant, à un moment donné, le comportement CRUD pour un de mes modèles (images) était cassé.
Le code d'erreur que je reçois est de retour comme suit: En d'autres termes ActiveRecord::RecordNotFound in ImagesController#show -- Couldn't find Image with ID=#<Image:0x4e2bd74>.
, quand je dis Rails pour créer / mettre à jour / détruire, il est source de confusion l'objet avec l'id. Cela semble indiquer qu'il pourrait y avoir un problème de routage. Je pensais que l'ajout d'une partie des images aurait pu être la peine, mais annuler les modifications ne pas le réparer.
Voici les nouvelles méthodes d'exposition et mise à jour du contrôleur pour le modèle Images:
# 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
# ...
Notez que show () est, bien sûr, en attendant un id approprié. Voici le new.html.erb pour le téléchargement d'une nouvelle image:
# 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 %>
La partie pertinente de routes.rb sont les suivants:
# routes.rb [excerpt]
map.resources :images
map.image 'images/:action/:id.:format', :controller => 'images'
Notez également qu'une nouvelle image ne get téléchargé en fait et l'erreur est jeté sur redirect pour montrer (qui attend une pièce d'identité valide dans params [: id] et non l'objet qui, pour une raison quelconque il est remis).
Merci pour votre aide à l'avance, et s'il vous plaît laissez-moi savoir si quelque chose vous saute au visage.
La solution
En regardant le code, il me semble que le problème peut être causé par l'utilisation en combinaison avec image_url(@image)
la route non RESTful image
.
Vous voudrez probablement supprimer la ligne
map.image 'images/:action/:id.:format', :controller => 'images'
de votre routes.rb
.
La ligne
map.resources :images
devrait effectivement être suffisant pour exposer toutes les actions CRUD dans votre ImagesController
.
Autres conseils
Ma suggestion est d'utiliser-debug rubis et définir un droit de point de rupture avant l'appel Image.find. Inspectez params [: id] et voir ce qu'il est en réalité.
Une approche plus ghetto, le mettre avant l'appel Image.find
logger.info params[:id].class
et voir ce qui est dans cette variable. Est-il possible que vous avez une sorte de filtre avant qui le manipuler?
essayer
redirect_to :action => "show", :id => @image
Je pense que ce d'une manière plus idiomatiques à coder la redirection. Et +1 à Molf de conseils sur les itinéraires RESTful.