26

HTML リンクでユーザーを破棄しますが、正しいリンクが生成されないようです。何が間違っていますか?

public function destroy($id)
{
    //Slet brugeren
    $e = new User($id);
    $e->destroy();

    //Log også brugeren ud
    Auth::logout();

    //redrect til forsiden
    Redirect::to("users/create");
}

私の見解では、これを呼び出します {{URL::action('UserController@destroy', array($user->id))}}

4

9 に答える 9

33

Laravel 5.x の更新 08/21/2017

質問はLaravel 4について尋ねますが、Laravel 5.xの回答を探している人がここにたどり着く場合に備えて、これを含めます。Form ヘルパー (およびその他の一部)は、5.x の時点では使用できません。GET や POST 以外のことをしている場合でも、フォームでメソッドを指定する必要があります。これを達成するための現在の方法は次のとおりです。

<form action="/foo/bar" method="POST">
    <input type="hidden" name="_method" value="PUT">
    <input type="hidden" name="_token" value="{{ csrf_token() }}">
    <!-- other inputs... -->
</form>

非表示の入力{{ method_field('PUT') }}を書き出す代わりに使用することもできます。_method

https://laravel.com/docs/5.4/routing#form-method-spoofingを参照してください

Laravel 4の元の回答

リンクをクリックすると、おそらくそのエンドポイントにGETリクエストが送信されていると思います。Laravel の CRUD は REST に従って動作します。これは、GET ではなく DELETE 要求を予期していることを意味します。

これは、Boris Strahija によるチュートリアルからの 1 つの可能性です。

    {{ Form::open(array('route' => array('admin.pages.destroy', $page->id), 'method' => 'delete')) }}
        <button type="submit" class="btn btn-danger btn-mini">Delete</button>
    {{ Form::close() }}

このようにして、DELETE メソッドを使用してフォームでリクエストを送信します。この記事では、従来のリンクが機能しない理由について説明しています。

削除ボタンがフォーム内にあることに気付くかもしれません。これは、コントローラの destroy() メソッドが DELETE リクエストを必要とするためで、これはこの方法で実行できます。ボタンが単純なリンクの場合、リクエストは GET メソッドを介して送信され、destroy() メソッドは呼び出されません。

于 2013-10-28T21:11:00.790 に答える
15

別の「クリーンな」解決策は、ここで説明されているように、Rails の方法で作成することです。

  1. public で新しい .js ファイルを作成し、次の関数を記述します。

    $(function(){
       $('[data-method]').append(function(){
            return "\n"+
            "<form action='"+$(this).attr('href')+"' method='POST' style='display:none'>\n"+
            "   <input type='hidden' name='_method' value='"+$(this).attr('data-method')+"'>\n"+
            "</form>\n"
       })
       .removeAttr('href')
       .attr('style','cursor:pointer;')
       .attr('onclick','$(this).find("form").submit();');
    });
    
  2. jQuery を含めた後、テンプレートに .js ファイルを含めることを忘れないでください。

  3. クラシックlink_to()またはlink_to_method()関数を使用してリンクを作成し、レコードを削除します。パラメータを含めることを忘れないで"data-method"="DELETE"ください:

    {{ link_to_route('tasks.destroy', 'D', $task->id, ['data-method'=>'delete']) }}
    

これについて私が気に入っているのはForm::open();、ブレード テンプレートでコードを肥大化させるよりもずっとすっきりしているように見えることです。

于 2014-04-15T11:25:46.117 に答える
8

これは古い質問ですが、簡単な答えを探していたので、これらのいずれにも満足していません. この同じ問題を抱えている人には、新しいルートを作成することをお勧めします。crud 準拠について心配しすぎるのはばかげています。HTML にはそのようなものがないからです。非表示のフォーム フィールドであろうと get ルートであろうと、どのソリューションも適合するように靴べらです。

したがって、ルートには次のようなものがある可能性があります。

Route::resource('users', 'UsersController'); これに関する問題は、「destroy」メソッドに到達する唯一の方法は、「_method」という名前の非表示の入力と「DELETE」の値を持つポスト リクエストを送信することです。

その行の下に追加するだけです: Route::get('users/{id}/destroy',['as'=>'users.delete','uses'=>'UsersController@destroy']);

HTML::linkRouteこれで、 、Route::url、または任意の方法からアクセスできるルートができました。

例えば: {{ HTML::linkRoute( 'users.delete', 'Delete' , [ 'id' => $user->id ]) }}

編集

はっきりさせておきたいのは、crud コンプライアンスに適合するために後ろ向きに曲がるのがややばかげている理由を説明しましたが、変更が POST 要求によってのみ行われた場合、アプリがより安全になるということです。

于 2014-12-19T20:18:20.363 に答える
4

フォーム外で DELETE リクエストを送信したいですか?

Jeffrey Wayはフォームを作成する素敵な JavaScript を作成しました。それを使用するにはdata-method="delete"、削除リンクに追加するだけです。

使用するには、 scriptをインポートし、属性とのリンクを作成しdata-method="DELETE"ます。

脚本 :

(function() {

  var laravel = {
    initialize: function() {
      this.methodLinks = $('a[data-method]');

      this.registerEvents();
    },

    registerEvents: function() {
      this.methodLinks.on('click', this.handleMethod);
    },

    handleMethod: function(e) {
      var link = $(this);
      var httpMethod = link.data('method').toUpperCase();
      var form;

      // If the data-method attribute is not PUT or DELETE,
      // then we don't know what to do. Just ignore.
      if ( $.inArray(httpMethod, ['PUT', 'DELETE']) === - 1 ) {
        return;
      }

      // Allow user to optionally provide data-confirm="Are you sure?"
      if ( link.data('confirm') ) {
        if ( ! laravel.verifyConfirm(link) ) {
          return false;
        }
      }

      form = laravel.createForm(link);
      form.submit();

      e.preventDefault();
    },

    verifyConfirm: function(link) {
      return confirm(link.data('confirm'));
    },

    createForm: function(link) {
      var form = 
      $('<form>', {
        'method': 'POST',
        'action': link.attr('href')
      });

      var token = 
      $('<input>', {
        'type': 'hidden',
        'name': 'csrf_token',
          'value': '<?php echo csrf_token(); ?>' // hmmmm...
        });

      var hiddenInput =
      $('<input>', {
        'name': '_method',
        'type': 'hidden',
        'value': link.data('method')
      });

      return form.append(token, hiddenInput)
                 .appendTo('body');
    }
  };

  laravel.initialize();

})();
于 2015-02-09T22:35:04.470 に答える
2

laravel 5でアンカータグを使用して削除ボタンを作成しようとしている人向け。

{!! Form::open(['action' => ['UserController@destroy', $user->id], 'method' => 'DELETE', 'name' => 'post_' . md5($user->id . $user->created_at)]) !!}
    <a href="javascript:void(0)" title="delete" onclick="if (confirm('Are you sure?')) { document.post_<?= md5($user->id . $user->created_at) ?>.submit(); } event.returnValue = false; return false;">
        <span class="icon-remove"></span>
    </a>
{!! Form::close() !!}
于 2015-09-13T11:05:30.640 に答える
1

私はあなたのコードを試し、このように使用して動作しました:

    <a href="{{URL::action('UserController@destroy',['id'=>$user->id]) }}" 
onclick=" return confirm('Are you sure you want to delete this?')" 
class="btn btn-default">
   DELETE     </a>

唯一の問題はあなたの配列にあると思います:

['id'=>$user->id]
于 2015-09-07T12:34:33.823 に答える