Проблема с параметрами Rails CRUD
-
21-08-2019 - |
Вопрос
Итак, мой опыт работы связан с веб-сервисами Java, но я пытаюсь перейти на ROR.
Я использую FlexImage для загрузки изображений и создания миниатюр.Я следовал руководству, и в какой-то момент поведение CRUD работало нормально.Однако в какой-то момент поведение CRUD для одной из моих моделей (изображений) было нарушено.
Код ошибки, который я получаю, выглядит следующим образом: ActiveRecord::RecordNotFound in ImagesController#show -- Couldn't find Image with ID=#<Image:0x4e2bd74>.
Другими словами, когда я говорю Rails создать/обновить/уничтожить, это путает объект с его идентификатором.Кажется, это указывает на то, что может возникнуть проблема с маршрутизацией.Я думал, что добавление частичного изображения для изображений может быть проблемой, но откат изменений не исправил ситуацию.
Ниже приведены новые методы показа и обновления контроллера для модели изображений:
# 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
# ...
Обратите внимание, что show(), конечно же, ожидает соответствующий идентификатор.Вот new.html.erb для загрузки нового изображения:
# 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 %>
Соответствующая часть маршрутов.rb выглядит следующим образом:
# routes.rb [excerpt]
map.resources :images
map.image 'images/:action/:id.:format', :controller => 'images'
Также обратите внимание, что новое изображение на самом деле загрузить и ошибка выдается при перенаправлении на показ (которое ожидает действительный идентификатор в params[:id], а не объект, который по какой-либо причине передается.)
Заранее спасибо за вашу помощь, и, пожалуйста, дайте мне знать, если у вас что-то возникнет.
Решение
Глядя на код, мне кажется, что проблема может быть вызвана использованием image_url(@image)
в сочетании с не-RESTful image
маршрут.
Вероятно, вы захотите удалить строку
map.image 'images/:action/:id.:format', :controller => 'images'
от твоего routes.rb
.
Линия
map.resources :images
на самом деле должно быть достаточно, чтобы раскрыть все действия CRUD в вашем ImagesController
.
Другие советы
Я предлагаю использовать Ruby-debug и установить точку останова прямо перед вызовом Image.find.Проверьте params[:id] и посмотрите, что это такое на самом деле.
Более гетто-подход, поместите это перед вызовом Image.find
logger.info params[:id].class
и посмотреть, что находится в этой переменной.Возможно ли, что у вас есть какой-то фильтр до, который им управляет?
пытаться
redirect_to :action => "show", :id => @image
Я думаю, что это более идиоматический способ закодировать перенаправление.И +1 к совету Молфа о маршрутах RESTful.