16

以下のコードを使用して投稿を削除しようとしています。

<%= link_to 'Destroy', post, :method => :delete, :onclick => "return confirm('Are you sure you want to delete this post?')" %>

これは機能しません...単に投稿にリダイレクトされます(posts/:id}

ただし、次のコードを使用すると機能します

<%= button_to 'Destroy', post, method: :delete, :onclick => "return confirm('Are you sure you want to delete this post?')" %>

この場合のようにlink_to動作させることは可能ですか?button_to

編集:コントローラー機能を破壊する

  def destroy
    @post = Post.find(params[:id])
    @post.destroy

    respond_to do |format|
      format.html { redirect_to posts_url }
      format.json { head :no_content }
    end
  end

破棄ボタンをクリックしたときのログ:

Started GET "/posts/14" for 127.0.0.1 at 2012-10-21 15:38:28 +0300
Processing by PostsController#show as HTML
  Parameters: {"id"=>"14"}
  Post Load (0.4ms)  SELECT `posts`.* FROM `posts` WHERE `posts`.`id` = 14 LIMIT 1
  Rendered posts/show.html.erb within layouts/application (0.6ms)
  User Load (0.4ms)  SELECT `users`.* FROM `users` WHERE `users`.`id` = 1 LIMIT 1
Completed 200 OK in 7ms (Views: 5.4ms | ActiveRecord: 0.8ms)
[2012-10-21 15:38:28] WARN  Could not determine content-length of response body. Set content-length of the response or set Response#chunked = true

ルート:

  devise_for :users

  resources :users

  resources :posts

  match '/about' => 'about#index'

  # You can have the root of your site routed with "root"
  # just remember to delete public/index.html.
  root :to => 'index#index'

  # See how all your routes lay out with "rake routes"

  # This is a legacy wild controller route that's not recommended for RESTful applications.
  # Note: This route will make all actions in every controller accessible via GET requests.
  # match ':controller(/:action(/:id))(.:format)'
  match '*a', :to => 'error#routing'
4

9 に答える 9

28

追加する必要があります

//= require jquery
//= require jquery_ujs

javascripts/application.js ファイル内

次に、レイアウト ファイルをチェックインし、

javascript_include_tag "application"

含まれていますか?

この助けを願っています。

于 2013-05-31T11:47:24.877 に答える
15

解決:

プロジェクトを作成したときに、application.jsからこれをコメントアウトしました

// This is a manifest file that'll be compiled into application.js, which will include all the files
// listed below.
//
// Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts,
// or vendor/assets/javascripts of plugins, if any, can be referenced here using a relative path.
//
// It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
// the compiled file.
//
// WARNING: THE FIRST BLANK LINE MARKS THE END OF WHAT'S TO BE PROCESSED, ANY BLANK LINE SHOULD
// GO AFTER THE REQUIRES BELOW.
//
//= require jquery
//= require jquery_ujs
//= require_tree .

再追加すると問題が解決しました

于 2012-10-21T14:36:25.740 に答える
5

この行をレイアウト ファイルに含めましたか?

<%= javascript_include_tag "application" %>
于 2012-10-21T11:03:19.820 に答える
3

まず、ログで生成されている HTTP post メソッドを確認してみてください。「Get」の場合、ルートなどに関係なく、コントローラーで削除アクションをトリガーしません。HTTP Delete メソッドである必要があります。

Rails 6以降を含むRailsの最新バージョンでは、jquery UJSなどを含めることはオプション/簡単ではありません。link_toの代わりにbutton_toヘルパーを使用する必要があります。削除 HTTP ポストを作成します。

https://apidock.com/rails/ActionView/Helpers/UrlHelper/button_to

于 2021-12-06T19:32:26.837 に答える
1

これはRailsの方法です:

<%= link_to 'Destroy', post, confirm: 'Are you sure?', method: :delete %>

投稿が削除されない場合、問題はコントローラーにあります。#destroyアクションを正しく実装したと確信していますか? サーバー ログにはどのような出力が表示されますか?

更新:アクションを次のように変更します。

def destroy
  @post = Post.find(params[:id])

  respond_to do |format|
    if @post.destroy
      format.html { redirect_to posts_url }
      format.json { head :no_content }
    else
      format.html # do something here
      format.json { head :no_content }
    end
  end
end
于 2012-10-21T11:42:09.867 に答える