Rails CRUD Параметры выдачи - PullRequest
0 голосов
/ 14 мая 2009

Итак, я знаком с веб-сервисами Java, но я пытаюсь перейти на ROR.

Я использую FlexImage для загрузки изображений и создания миниатюр. Я следовал руководству, и поведение CRUD в какой-то момент работало нормально. Однако в какой-то момент поведение CRUD для одной из моих моделей (изображений) было нарушено.

Код ошибки, который я получаю, выглядит следующим образом: ActiveRecord::RecordNotFound in ImagesController#show -- Couldn't find Image with ID=#<Image:0x4e2bd74>. Другими словами, когда я говорю Rails о создании / обновлении / уничтожении, он путает объект с идентификатором. Похоже, это указывает на возможную проблему маршрутизации. Я думал, что добавление частичного для изображений могло быть проблемой, но откат изменений не исправил это.

Ниже приведены новые методы показа и обновления контроллера для модели 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 
     # ...

Обратите внимание, что show (), конечно, ожидает соответствующий идентификатор. Вот новый.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 %>

Соответствующая часть rout.rb выглядит следующим образом:

# routes.rb [excerpt]

  map.resources :images
  map.image 'images/:action/:id.:format', :controller => 'images'

Также обратите внимание, что новое изображение действительно загружается , и при перенаправлении выдается сообщение об ошибке (которое ожидает действительный идентификатор в params [: id], а не объект, который по какой-либо причине вручается.)

Заранее спасибо за помощь, и, пожалуйста, дайте мне знать, если у вас что-нибудь получится.

Ответы [ 3 ]

5 голосов
/ 14 мая 2009

При просмотре кода мне кажется, что проблема может быть вызвана использованием image_url(@image) в сочетании с маршрутом без RESTful image.

Возможно, вы захотите удалить строку

map.image 'images/:action/:id.:format', :controller => 'images'

от вашего routes.rb.

Линия

map.resources :images

на самом деле должно быть достаточно, чтобы раскрыть все действия CRUD в вашем ImagesController.

1 голос
/ 14 мая 2009

Я предлагаю использовать ruby-debug и установить точку останова прямо перед вызовом Image.find. Изучите params [: id] и посмотрите, что это на самом деле.

Более гетто-подход, поставьте его перед вызовом Image.find

logger.info params[:id].class

и посмотрите, что находится в этой переменной. Возможно ли, что у вас есть какой-то фильтр до этого, который манипулирует им?

0 голосов
/ 14 мая 2009

1001 * попробовать *

  redirect_to :action => "show", :id => @image

Я думаю, что это более идиоматический способ кодирования перенаправления. И +1 к совету Мольфа о RESTful маршрутах.

...