0

ユーザー用に 2 つのモデルがあります。Plans モデルには has_many のユーザーがいます。今、私がやりたいことは、plan_id を変更して、ユーザーがプランをアップグレード/ダウングレードできるようにすることです。フォームと適切なアクションを設定しましたが、送信を押したときに、PUT アクションが示すことを実行していないようです。更新アクションを使用しているようです。

ここに私のフォームがあります:

                       <%= form_tag("/users/update_plan", :method => "put" ) do %>

                        <%= hidden_field_tag :plan_id, plan.id %>

                        <%= submit_tag("Change To Plan", :class => "signup") %>


                      <% end %>

これが私の更新アクションです

  def update_plan
   @user = current_user
   @user.plan_id = params[:plan_id]
   @user.save
   sign_in @user
   redirect_to change_plan
  end   

上記のフォームを送信すると、変更が登録されないだけでなく、 update_plan アクションではなく update アクションが使用されていると思います。これは、更新アクションの内容にリダイレクトされ、更新アクションと同じものが点滅するためだと思う理由です。

  def update
    @user = current_user
    if @user.update_attributes(params[:user])
      flash[:success] = "Profile updated"
      sign_in @user
      redirect_to edit_user_path(@user)
    else
      render 'edit'
    end
  end    

これが私のroutes.rbファイルです

Dentist::Application.routes.draw do

  resources :users
  resources :sessions, only: [:new, :create, :destroy]
  resources :phones, only: [:new, :create, :destroy]
  resources :find_numbers, only: [:new, :create, :destroy]  

  put 'users/update_plan'
  match '/signup',  to: 'users#new'
  match '/login',  to: 'sessions#new'
  match '/signout', to: 'sessions#destroy', via: :delete
  match '/change_plan',  to: 'users#change_plan'

  root  to: 'static_pages#home'

  match '/product_demo', to: 'static_pages#product_demo'

  match '/pricing', to: 'plans#index'

  match '/contact', to: 'static_pages#contact'

そして、これが何が起こっているかのコンソールのスクリーンショットです:

http://stepanp.com/debug3.jpg

update_plan アクションを使用しているようですが... :S

Update_plan アクションを機能させるための助けをいただければ幸いです。

4

1 に答える 1

1

フォームは正しい場所 (/users/update_plan) に送信されますが、次の場所にルーティングされます。

UsersController#update

コンソール ログの 2 行目にあるとおりです。したがって、期待するアクションではなく、問題はルートにあります。これを試して、すべてのルートを一覧表示します。

rake routes

おそらく、ユーザーの更新ルート (リソース :users によって作成された) が最初にこれをキャッチしています:

PUT    /users/:id(.:format)                                   users#update

id の内容に制限はなく、形式はオプションであるため、users/update_plan は update_plan の id で users/update を呼び出します (実際、コンソール ログのスクリーンショットの端で発生していることがわかります。 :id => パラメータ)。

したがって、カスタムルートをルートファイルの最初にリソース:usersの上に移動し、必要なアクションに直接変更しようとしますが、アクションが指定されていないルートが何をするかわかりません...

 put '/users/update_plan',  to: 'users#update_plan'
于 2012-10-06T14:40:33.903 に答える