Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

custom action in rails 3

I'm trying to make a simple link that will toggle my "status" attribute in my model from "pending" to "active". For example, when I first create a user, I set the status to "pending". Then when I show the list of users, I add a button that should change that user's status to "active". I tried this via a custom action (is this a good approach?) but I'm having trouble with the auto-generated named route.

in my user index.html.haml: button_to "Manually Activate", activate_user_path

in routes.rb:

resources :users do
  get :activate, :on => :member

in users_controller.rb:

 def activate
    @user = User.find(params[:id])
    @user.update_attribute(:status, 'Active')
    redirect_to @user
  end

this seems to work when I go to say, /users/1/activate, as the status will update. However, the /users page doesn't show and gives me error:

ActionController::RoutingError in Users#index
No route matches {:action=>"activate", :controller=>"users"}

ie, it is having a problem with the activate_user_path I specified in my view. (However if I use another named-routes-style path that I haven't specified in my routes.rb to test it out, I get

NameError in Users#index
undefined local variable or method `blahblah_user_url' for #<#<Class:0x00000102bd5d50>:0x00000102bb9588>

so it seems that it knows it's in the routes.rb but something else is wrong? I'm really new to rails and would appreciate the help! thanks!

like image 246
butterywombat Avatar asked Dec 19 '10 21:12

butterywombat


2 Answers

Your link should look like this:

button_to "Manually Activate", activate_user_path(@user)

You need to add what user you want to activate.

like image 74
klew Avatar answered Sep 20 '22 17:09

klew


A number of problems, I can see. Firstly you should NOT update the database using a GET request. Secondly button_to will provide you with an inplace form which when clicked will POST to your app. Thirdly, the way you have your routes setup, you need to provide the user in the path (you've tested it by forming the url in the browser already).

run

rake routes

on the command prompt to see how your routes look and the name you can use to generate those routes.

I suspect you need to use

button_to "Manually Activate", activate_user_path(user)

(user or @user or whatever is the user object). In your button_to call and change the "get" to "post" in the routes file.

resources :users do
  member do
    post :activate
  end
end
like image 25
Aditya Sanghi Avatar answered Sep 22 '22 17:09

Aditya Sanghi