Basic routing question

Hi, I'm learning about routing and trying to solve the problem below. Using update_scope_path in the view is routing to "users/show" rather than users/update_scope, with "update_scope" becoming the user id.

( The goal is to change session[:question_scope] to "vip" when the user clicks the button in the view. I assume I have to go to a controller action to do that.)

In routes.rb: resources :users match '/users/update_scope', :to => 'users#update_scope', :as => :update_scope

In users_controller: def update_scope     session[:question_scope] = "vip" end

In users/show: <%= link_to 'Go', update_scope_path, :class => 'btn btn-mini' %>

In debug params: --- !ruby/hash:ActiveSupport::HashWithIndifferentAccess action: show controller: users id: update_scope

I would suggest doing this.

resources :users

scope ‘/users’ do

put ‘update_scope’, to: ‘users#update_scope’, as: :update_scope

end

That might work. What I’d honestly consider is making a scope controller and using the update action. If you don’t need the others, then your routes will look like this.

resources :users do

resources :scopes, only: [ :update ]

end

~Johnneylee

So I can't create an action in any controller that sets the session variable and then call it through the route?

Can you tell me why it is going to users /show instead of users/update_scope?

I am trying to understand how this works as well as get it working...

Thanks!

Using update_scope_path in the view is routing to "users/show" rather than users/update_scope, with "update_scope" becoming the user id.

( The goal is to change session[:question_scope] to "vip" when the user clicks the button in the view. I assume I have to go to a controller action to do that.)

Yes.

In routes.rb:

  resources :users

The above includes /users/:id, which *matches first* - winning! So the routing engine won't ever get to your other route.

  match '/users/update_scope'

Reverse the order in routes.rb and try it.

Thank you!