1

私は Rails の初心者であり、ユーザー コントローラー内でカスタムの update_password アクションを実行し、パスワードを画面にフラッシュするはずだった「新しいパスワードを生成する」リンクの理由を理解しようと数時間費やしました (後でこれを電子メールまたはSMSで送信する予定ですが、今のところこれで十分です) createメソッド/アクションを実行し続けます... ユーザーのインデックス画面に2つのPOSTメソッドがあることは理解しています...しかし理解できません(ルートファイルの最初に配置したとしても)なぜ create が実行され続けるのか. どこにも表示されないデバッガーのログメッセージでいっぱいになったので、更新メソッドに行かないことはわかっています。(インデックスメソッドのログメッセージが表示されるため、ログはアクティブです)

これが私がやっていることです:

routes.rb ファイルの抜粋:

match 'users?user_id=(:user_id)', to: "users#update_password", via: :post, as: "users_update_password"

リソース:ユーザー

rake ルート (コントローラーユーザー)

users_update_password POST   /users?user_id=(:user_id)(.:format) users#update_password
            users GET    /users(.:format)                    users#index
                  POST   /users(.:format)                    users#create
         new_user GET    /users/new(.:format)                users#new
        edit_user GET    /users/:id/edit(.:format)           users#edit
             user GET    /users/:id(.:format)                users#show
                  PUT    /users/:id(.:format)                users#update
                  DELETE /users/:id(.:format)                users#destroy
           signup        /signup(.:format)                   users#new

users_controller.rb

          def update_password
logger.info "Inside update_password"
logger.flush
password= generate_password()
logger.debug "Password is #{password}"
@user = User.find_by_id(params[:user_id])
logger.debug "user is #{@user}"
if @user.update_attributes(password:password, password_confirmation:password)
  logger.info "inside the if"
   flash[:notice] = "New password for user #{@user.name}: #{password}"
   logger.debug "Flash is #{flash}"
   redirect_to users_path
else
  logger.debug "I am on else of update_password"
  flash[:alert] = "Name: #{@user.name} password: #{password}"
  render 'index'
end

終わり

def index
logger.info "Inside controller index method"
@users = User.paginate(page: params[:page])

終わり

_user.html.erb

<% if current_user.admin? && !current_user?(user) %>
 | <%= link_to "delete", user, method: :delete, confirm: "Are you sure?" %>
 | <%= link_to "Generate new password", users_update_password_path(:user_id=>user.id), method: :post, confirm: "Are you sure? This will reset current password" %>
<% end %>

ご協力ありがとうございました

4

2 に答える 2

0

これをリソースルートのメンバーにすると、物事が単純化される可能性がありますか?

resources :users do
  member do
    post 'update_password'
  end
end

次に、パスヘルパーはおそらく次のようになります

link_to "Generate new password", update_password_user_path(user), method: :post
# POST. /users/:id/update_password

http://guides.rubyonrails.org/routing.html#adding-more-restful-actions

于 2012-06-17T17:46:14.857 に答える
0

HTTP POST を使用すると、データは URL で送信されません。ルートは URL 内のデータを探します。これは HTTP GET を介して行われます。したがって、POST を使用する場合は、ルートを次のようにします。

post "users/update_password" => "users#update_password", :as => "users_update_password"
于 2012-06-17T20:30:55.447 に答える