0

すべて、putメソッドで動作するカスタムアクションを取得しようとしています。

_post.html.erbにlink_toステートメントがあります:

<%= link_to 'End now', post, :method => :put, :action => endnow %>

ルート.rbに含まれるもの:

  resources :posts do
    member do
      put :endnow
    end

そしてposts_controller.rbは次のようになります:

class PostsController < ApplicationController
  helper_method :endnow

  [.. code for create, edit, destroy, etc ..]

  def endnow
    puts params
  end

end

rakeルートの関連行は次のようになります:endnow_post PUT / posts /:id / endnow(.: format)posts#endnow

ただし、このリンクをクリックすると、アクションendnowヘルパーは実行されません。不思議なことに、インデックスアクションで実行されます(putsコマンドからわかります。もちろん、最終的にendnowのコードは@postを更新しますが、今のところ、正しく実行されません。

たぶん私はこれを間違った方法で行っています-私が達成しようとしているのは、その投稿へのリンクをクリックして表示する前に@postを更新することだけです。

アイデア/代替案はありますか?

4

1 に答える 1

8

提供されているルートヘルパーメソッドを使用してみませんか?リンクをに変更します

<%= link_to 'End now', endnow_post_path(@post), method: :put %>

あなたが間違っていること:

  1. を指定する場合は:action、アクションにシンボルを使用します(コロンがありません)。 :action => endnowする必要がありますaction: :endnow
  2. @postコントローラからアクションに渡すインスタンス変数があると仮定します。代わりにそれを使用する必要があります(実際にコードから省略しpostているローカル変数がない場合)post
  3. endnowアクションとして使用しています。helper_method :endnowビューからアクセスしたい/アクセスすべきものではないため、コントローラーの行を削除する必要があります。

これはすべて、ルートヘルパーを使用して(ローカルルートパスを取得するためにendnow_post追加するために:) 、引数として渡すことで回避できます。_pathendnow_post_path@post

リクエストを実行しようとしているため、これらのリンクをバックグラウンドでフォーム送信に変換するために、アセットパイプラインに含まれPUTているようなものがあることを確認する必要があります。ブラウザは、リンクをクリックするだけでjquery-ujsはサポートされません。PUT


作業中にテンプレートエラーが発生する理由についてはlink_to、Railsからapp/views/posts/endnow.html.erbファイルを作成する必要があると言われています。アクションにはputs params実行を終了しないものだけがあり、Railsはまだendnow.html.erbテンプレートをレンダリングしようとしていると想定します。


あなたがやろうとしていることをする他の方法はありますか(特定のモデルの単一の属性を変更する)?もちろん。より良い方法はありますか?それはかなり主観的です。これは最もRESTfulな方法ではないかもしれませんが、おそらく対処が簡単です(たとえば、変更する属性を更新する前に確認する非常に具体的な承認ルールがある場合endnow。肉付けを開始した方法は機能しますか?もちろんです

最後に、正しい方向へのバンプとして、上記link_toのようにを修正して削除した後、アクションは次のようになります。helper_methodendnow

def endnow
  post = Post.find!(params[:id])

  post.some_attribute_here = some_new_value_here
  post.save

  redirect_to :root and return # <- this line sets a redirect back to your homepage and terminates execution, telling rails to do the redirect and **not** to render some endnow.html.erb file
end
于 2013-03-26T16:35:03.743 に答える