I have two models for users ; the Plans model has_many users. Now, what I would like to do is to allow users to upgrade/downgrade their plans, by changing the plan_id. I’ve set up a form, as well as the appropriate action, but when I hit submit, it doesn’t seem to do what the PUT action says. It seems to use the update action.
Here’s my form :
<%= form_tag("/users/update_plan", :method => "put" ) do %>
<%= hidden_field_tag :plan_id, plan.id %>
<%= submit_tag("Change To Plan", :class => "signup") %>
<% end %>
Here’s my update action
def update_plan
@user = current_user
@user.plan_id = params[:plan_id]
@user.save
sign_in @user
redirect_to change_plan
end
When I submit the form above though, it not only doesn’t register the change, but I think it uses the update action, and not the update_plan action. The reason I think this is because it redirects to the what’s in the update action, and it flashes the same thing as the update action.
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
Here’s my routes.rb file
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'
And here’s a console screenshot of what’s happening:
It seems to say it’s using the update_plan action, but… :S
Any help on trying to get Update_plan action to function would be greatly appreciated!
The form is going to the right place (/users/update_plan), but that is being routed to:
as it says on the second line of your console log. So not the action you expect, and the problem is in your routes. Try this to list all your routes:
Probably the users update route (created by resources :users) is catching this first:
There are no restrictions on the content of id, and format is optional, so users/update_plan would call users/update with an id of update_plan (in fact you can see that is happening at the edge of your console log screenshot, look for the :id => parameter).
So I would move your custom route to the top of the routes file first above resources :users, and also try change it to direct to the action you want, not sure what a route with no action specified does…