0

こんにちは、私はレールにかなり慣れていないため、新しいポスト メソッドを追加しようとして問題が発生しています。

ユーザーを有効にする新しいメソッドを作成したいと思います。

したがって、次のメソッドを持つようにユーザーコントローラーを変更しました

def enable

if (!@user.enabled)
  @user.enabled = true;
  if @user.save
    UserMailer.send_enabled_message(@user).deliver
    redirect_to users_url, notice: 'User was successfully enabled.'
  else
    redirect_to users_url, notice: 'Could not enable user.'
  end
else
redirect_to users_url, notice: 'Could not enable user.'
end

終わり

そして、ルートに以下を追加しました。

match 'users/:id' => 'users#enable', :via => 'post', :action => :enable

そして、ユーザーのテーブルを表示する私のビューに以下を追加しました:

<td><%= link_to 'Enable', user, method: :enable, data: { confirm: 'Are you sure?' } %></td>

これはすべて機能しているようですが、ログインできなくなったため、ルートがログイン投稿を上書きしたと思います。新しいフォームを作成する必要がありますか?それとも、このように簡単に送信できますか?

また、link_to を使用しているときに同じ行に沿って、次のようなことを行うにはどうすればよいですか:メソッド<%= link_to 'enable', enable_user(user) %>を作成する方法/場所はenable_user?

GoGoCarl に感謝します。ルートをこれに変更する必要がありました:

resources :users do
    post 'enable', on: :member
end

そしてこれに対する私の見解:

<td><%= link_to 'Enable', enable_user_path(user), method: :enable, data: { confirm: 'Are you sure?' } %></td>
4

1 に答える 1

3

routes.rb のルート定義を変更するだけで、すべての質問に答えることができます。追加した行を削除し、おそらくあると思われる場所の下に:

resources :users

次のように変更します。

resources :users do
  post 'enable', :on => :collection
end

これにより、メンバー (/users/2) ではなく、コレクション (/users) のリソース レベルでハンドラーが追加されます。ユーザーコントローラーの「enable」メソッドによって自動的に処理されます。

したがって、最初の回答 - はい、ユーザーに投稿するすべての URL を照合しているため、ログイン POST は実際に上書きされます。上記のように定義すると、希望どおりにルーティングされます。

2 番目の回答は、どのように URL を取得しますか? さて、このようにルーティングされたので、 rake routes を実行して、定義されたパスが何であるかを確認できます。今のところ、私はあなたの面倒を免れます:

enable_users_path

したがって、次のことができます。

link_to 'enable', enable_users_path

繰り返しますが、上記の方法でルートを定義することにより、このパス メソッドが生成されます。後でこれに遭遇した場合は、属性を介してこのメ​​ソッドを定義することもできます。

したがって、上記の変更を行う場合は、次のことを行う必要があります。

  1. ログインを元に戻すことができる (ユーザーへの他の POST メソッドと同様)
  2. URL を取得するメソッド enable_users_path を用意する
  3. /users/enable に投稿できるようにする

それでうまくいくはずです。ルーティングの詳細については、http: //guides.rubyonrails.org/routing.htmlを参照してください。

于 2013-07-04T05:38:24.280 に答える