2016-03-29 6 views
0

クリックするとリソースが削除されるようにするアクションメーラーのリンクを生成するのに少し問題があります。ここでdeleteメソッドのための私のコードは、(アプリの内部に正常に動作する)です:ここではアクションメーラーのモデルリソースリンクを削除するビュー

def destroy 
    @registrant = Registrant.find(params[:id]) 
    @registrant.destroy 
    flash[:danger] = "Your registration has successfully been cancelled." 
    redirect_to root_url 
    RegistrantMailer.cancellation_email(@registrant, @registrant.event).deliver_now 
    rescue 
     flash[:warning] = "No registration record found." 
     redirect_to root_url 
    end 

は、アプリケーションのルートです:

Prefix Verb URI Pattern      Controller#Action 
     registrants POST /registrants(.:format)   registrants#create 
      registrant GET /registrants/:id(.:format)  registrants#show 
        DELETE /registrants/:id(.:format)  registrants#destroy 
static_pages_contact GET /static_pages/contact(.:format) static_pages#contact 
    static_pages_about GET /static_pages/about(.:format) static_pages#about 
       events GET /events(.:format)    events#index 
        POST /events(.:format)    events#create 
      new_event GET /events/new(.:format)   events#new 
      edit_event GET /events/:id/edit(.:format)  events#edit 
       event GET /events/:id(.:format)   events#show 
        PATCH /events/:id(.:format)   events#update 
        PUT /events/:id(.:format)   events#update 
        DELETE /events/:id(.:format)   events#destroy 
       root GET /        static_pages#home 

そして、ここでは、中にIメーラーからのリンクあり削除リンクを生成します:Railsのビュー内からPUTとDELETEステートメントを発行する能力が原因余分な作業のレールにある

<p>Can't make the event? Click here to cancel your registration: <%= link_to 'Destroy', @registrant, method: :delete %> </p> 
+0

生成された電子メール内のHTMLリンクを検査します。リンクをたどって、コントローラの動作がヒットしていることを確認してください。あなたがそれを得るなら、問題をあなたのコントローラーアクションに絞り込んだのです。ところで、あなたが示したコードにはアクセスコントロールがありません。つまり誰でも誰でも削除できます。 –

+0

投稿する前に調べましたが、ブラウザが常にGETリクエストを送信し、削除アクションがDELETEを使用するため、正しいコントローラとアクションに当たっている間にエラーが発生しました。アクセスコントロールを指摘してくれてありがとう、私は実際にコントローラにいくつかのメソッドがあり、電子メールリンクを認証するためのトークンを追加しています。 – Jarrel09

+0

正しいコントローラアクションに当たっていたら、どのようにHTTPメソッドを変更することで解決できますか?すべてのHTTPメソッドはコントローラアクションへのルートです。とにかく嬉しく思ったのです –

答えて

2

はuniversallあるリンクと、問題の要求をフォーマットしませんyはブラウザによって理解される。通常、フォームの送信やドキュメントの要求時に、ブラウザはGETとPOSTのHTTP動詞の使用方法のみを知っています。 Railsでは、POSTリクエストを発行し、リクエストがサーバーによってDELETEリクエストとして解釈されるべきであることを示すHTTPヘッダーを指定することによって、他の動詞を使用することができます。

mailerビューでlink_toヘルパーを使用すると、Railsが変換してリクエストを発行するために使用する追加のjavascriptが存在しないため、リンクをクリックすると追加情報なしでGETリクエストが送信されます。

1:GETリクエストを経由してキャンセルすることができ、登録を行います

は本当に2つのオプションがあります。これは誰もがこのエンドポイントにGETリクエストを発行して登録を削除することを可能にするので、これは最も簡単な方法ですが、これはWebクローラーがページを索引付けするためにGETリクエストを発行してしまい、 )。

2:RailsのGETアクセシブルなリンク先ページへの直接のメーラー表示のリンクを作成します。ユーザーがいったんここに来ると、リンク先のページには追加の指示があり、ブラウザがRailsのjavascriptヘルパーに再びアクセスできるため、DELETEリンクが機能します。

+0

ありがとうございます。私は番号2で編集アクションへのリンクを入れてそこに削除ボタンを作成するだけで終わった。 – Jarrel09

関連する問題