2009-05-14 9 views
0

Так что мой фон в веб-сервисах Java, но я пытаюсь сделать переход к ROR.Rails CRUD Parameters Issue

Я использую 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 
    # ... 

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

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

# routes.rb [excerpt] 

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

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

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

+0

Поскольку ошибка возникает в методе 'show', возможно, вы захотите опубликовать это тоже? – molf

+0

Размещено; обратите внимание, что проблема также проявляется при обновлении и уничтожении. –

+0

Также, если это помогает, метод destroy() делает то, что должен, если я вручную введу '/ destroy/id' в URL. –

ответ

5

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

Вы, вероятно, хотите, чтобы удалить строку

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

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

Линия

map.resources :images 

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

+0

Мне было интересно об этом. Спасибо за помощь! –

+0

Вы можете увидеть это, если включить и исключить строку 'map.image' и запустить (в командной строке)' rake routes'. Это покажет вам, какие маршруты просматривает Rails и как URL-адрес перенаправляется на ваши разные контроллеры и действия. –

1

Мое предложение - использовать ruby-debug и установить точку разрыва непосредственно перед вызовом Image.find. Проверьте параметры [: id] и посмотрите, что это на самом деле.

Более Гетто подход, поставить это перед Image.find вызова

logger.info params[:id].class 

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

+0

Спасибо! Именно это и происходит. Класс params [: id] - это String, и его значение равно дескриптору объекта, то есть «# ». Что может сделать идентификатор таким образом? Единственной инструкцией ниже определения класса ImagesController является «cache_pages: show». –

+0

Сделайте источник просмотра в своем браузере и узнайте, что находится в форме. Это мое первое предположение. – jshen

0

попробовать

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

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

+0

По крайней мере, вам придется включить идентификатор в этом случае: redirect_to: action => "show",: id => @ images.id – molf

+0

На самом деле он работает без него, и он дает Rails возможность использовать #to_param if один определяется на модели. – asplake

+0

Вы правы, я был (по-видимому, преждевременно) со ссылкой на вашу предварительную версию. Не обращайте внимания сейчас;) – molf