开发者

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 specifi开发者_Go百科ed 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!


Your link should look like this:

button_to "Manually Activate", activate_user_path(@user)

You need to add what user you want to activate.


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
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜