2

現在、Rails でカスタム メソッドを使用しようとしていますが、その方法がわかりません。コントローラーのデフォルトのメソッドとは別に、次のメソッドを追加したいと思いました。

  def cancel
    @newsletter = Newsletter.find(params[:id])

   respond_to do |format|

  #SendGrid Newsletter API - Delete Newsletter Schedule
  SendGrid.delete_schedule(@newsletter.name)

  @newsletter.status = "CANCELLED"

  @newsletter.save

  format.html { redirect_to newsletters_url }
  format.json { head :no_content }
end

終わり

このメソッドはデフォルトの :destroy メソッドと同じですが、実際にはオブジェクトを破棄しません。

私の見解では、次のことがありました。

<% @newsletters.each do |newsletter| %>
  <tr>
    <td><%= newsletter.identity %></td>
    <td><%= newsletter.name %></td>
    <td><%= newsletter.recipients %></td>
    <td><%= newsletter.subject %></td>
    <td><%= newsletter.html %></td>
    <td><%= newsletter.text %></td>
    <td><%= newsletter.schedule %></td>
    <td><%= newsletter.status %></td>
    <td><%= link_to 'Show', newsletter %></td>
    <td><%= link_to 'Edit', edit_newsletter_path(newsletter) %></td>
    <td><%= link_to 'Destroy', newsletter, method: :delete, data: { confirm: 'Are you sure?' } %></td>
    <td><% if newsletter.status == "SCHEDULED" %><%= link_to 'Cancel', newsletter, method: :cancel, data: { confirm: 'Cancel Schedule?' }%><% end %></td>

  </tr>
<% end %>

エラーが発生しました: [POST] に一致するルートがありません " _ニュースレターの URL __ "

ルートをレーキすると、上記のエラーのルートがありません。ルートを追加する方法とルートが必要な理由を教えてください。


更新 現在、ルートが一致しないというエラーがまだあります。以下は、「キャンセル」メソッドに関連するすべてのファイルです。

ルート.rb

  resources :newsletters do
    match '/cancel/:id' => 'newsletters#cancel', :as => :cancel
  end

ニュースレター_controller.rb

def cancel @newsletter = Newsletter.find(params[:id])

respond_to do |format|

#SendGrid Newsletter API - Delete Newsletter Schedule
  SendGrid.delete_schedule(@newsletter.name)

  @newsletter.status = "CANCELLED"

  @newsletter.save

  format.html { redirect_to newsletters_path(@newsletter) }
  format.json { head :no_content }
end
end

ニュースレター/index.html.erb

<%= link_to 'Cancel', newsletter_cancel_path(newsletter) %>
4

3 に答える 3

2

config/routes.rbファイルに次のような行が必要です

resources :newsletters

これに変更したいと思うでしょう

resources :newsletters do
  member do
    put 'cancel'
  end
end

Иван Бишевац が投稿したルーティング ガイドを参照してください。また、基本的な RESTful ルーティングと、Rails が GET、POST、PUT、DELETE などを処理する方法についても理解しておく必要があります。

于 2012-07-10T20:16:43.517 に答える
1

コントローラーのメソッドに対応するmethod:引数を誤解していると思います。link_to実際には、RESTful HTTP 動詞、つまり :post、:delete、:put を参照しています。したがって、この方法でコントローラー アクションを渡すことはありません。

代わりに、:controller および :action 引数を渡すことができます...

routes.rb でルートを作成し、rails が生成するパスを使用することをお勧めします。

match "/cancel/:id", to: "controller#cancel", as: :cancel

そして、link_to は次のようになります。

link_to 'Cancel', cancel_path(newsletter)

更新: 取得しているエラーは、キャンセル メソッド (コントローラー内) の redirect_to にあります。newsletter_path(@newsletter)代わりに、newsletters_url を変更してください。

単一のニュースレターのショー ページにリダイレクトする場合は、上記 (@newsletter パラメーターを渡す場所) を実行する必要があります。ニュースレターのインデックス ページに戻る場合は、次のようになります。newsletters_path.

ターミナルに入力して、ルートの存在を確認できrake routesます。そこにすべてのルート名が表示されます。

に変更した後もエラーが発生しredirect_to newsletter_path(@newsletter)ますか?

まったく当てはまらないのは、 POST ルートが定義されていないことです。これは通常、不正な形式を指しform_forます。定期的に行っていないニュースレター関連のフォームを特に調べてくださいform_for @newsletter do |f|

于 2012-07-10T20:17:01.463 に答える
1

ルーティングに関する完全な説明は次のとおりです: http://guides.rubyonrails.org/routing.html

于 2012-07-10T20:11:57.463 に答える