Как правильно удалить это? - PullRequest
       39

Как правильно удалить это?

0 голосов
/ 06 декабря 2010

Что-то здесь серьезно не складывается ... Моя страница просто обновляется, ничего не происходит, она никогда не затрагивает моих отладчиков, зависающих на всех моих методах, кроме индекса.

my html:

<%- for image in @images %>
  <%= image.attachment_file_name %>

  <%-# link_to_delete image, :url => destroy_image_admin_wysiwyg_path(image.id) %>
  <%= link_to 'delete', { :url => destroy_image_image_path(image.id) },
        #:confirm => 'Are you sure?',
        :post => true
     %>

  <br />
<% end %>

мой контроллер

def destroy_image
  debugger
  @img = Image.find(params[:id])
  @img.destroy
  respond_to do |format|
    format.html { redirect_to admin_image_rotator_path }
  end
end

Мои маршруты:

map.resources :images, :member => { :destroy_image => :post }

Мойотвратительный хак, который работает, и я заменю его, как только найду что-нибудь получше

Я перенес действие на более простой контроллер, который я сам построил.

Изменил мои маршруты на:

admin.resources :wysiwygs, :member => { :destroy_image => :post }

Изменил мой html:

<%= link_to 'delete', :controller => "wysiwygs", :action => "destroy_image" %>

Но когда я нажал на ссылку ... он поднял .. действие show ??fffffffffuuuuuuu

Я отомстил, просто переместив свое действие в действие шоу и передав скрытое поле в моем html ..

<%= link_to 'delete', :controller => "wysiwygs", :action => "destroy_image", :hidden_field => {:value =>  image.id} %>

  def show
    # this was previously in destroy_image
    @img = Image.find(params[:hidden_field][:value])
    @img.destroy
    respond_to do |format|
      format.html { redirect_to admin_image_rotator_path }
    end
  end

Ответы [ 3 ]

3 голосов
/ 07 декабря 2010

Кажется, вы идете по неверному пути здесь.Если before_filter блокирует ваше действие, выясните, почему .Используйте skip_before_filter :filter_name, если фильтр не нужен.

Не используйте show действия или HTTP GET для удаления.Даже если это сработает, это может сбить с толку в будущем.Используйте глагол DELETE:

map.resources :images, :member => { :destroy_image => :delete }

, передайте его в помощник по ссылке:

<%= link_to "delete", destroy_image_image_path(image), :method => :delete %>

И используйте ImagesController#destroy_image для выполнения действия.Еще лучше рассмотреть возможность использования стандартного RESTful ImagesController#destroy, который map.resources дает вам бесплатно.

1 голос
/ 07 декабря 2010

Не уверен, что, во-первых, что-то не так, но в вашем втором, рабочем решении, я думаю, вы должны написать link_to следующим образом:

link_to 'delete', :controller => "wysiwygs", :action => "destroy_image", :id => image.id    

Это, по крайней мере, отправит вас к правильному действию. В зависимости от ваших маршрутов, вам придется сделать это method => :post или нет. Проверьте вывод rake routes, он покажет вам возможные маршруты, а также имена, которые они получили, которые, в свою очередь, вы можете использовать в качестве метода (добавьте _path или _url в конце). Тогда было бы еще проще написать что-то вроде:

link_to 'delete', wysiwygs_destroy_image_path(image)

Удачи!

0 голосов
/ 06 декабря 2010

Вы делаете POST, но ваш ресурс говорит, что: destroy_image доступно только через GET. Попробуйте изменить маршрут на:

map.resources :images, :member => { :destroy_image => :post }

Кроме того, взгляните на ваш link_to. Второй параметр принимает URL, а не хеш с ключом: url. Как уже упоминалось, в зависимости от вашей версии Rails вам может понадобиться :method => :post вместо :post => true. В Rails 2.3.8 вы хотели бы вместо этой строки:

<%= link_to 'delete', destroy_image_image_path(image), :method => :post %>
...