Rails 3 how to add a custom method to controller

2020-06-25 04:31发布

I'm using the http://guides.rubyonrails.org/getting_started.html as an example to help me create my own application. I create the blog and comments modules just fine. When I add a method to the comments or blog controllers I cannot get a link_to action to work calling the new function. Everything points to a problem in the routes.rb but I've tried all the new syntax I've seen and nothing is working for me.

What I'm trying to do is create a simple execute method in the controller to run a ruby script and save the output to the database. Everything works according to the tutorial but when I try to extend the comment controller with a custom function called execute I cant get that to run.

comments_controller.rb  #Same as destroy 
def execute
  @post = Post.find(params[:post_id])
  @comment = @post.comments.find(params[:id])
  @comment.destroy
  redirect_to post_path(@post)
 end

_comment.html.erb
<%= link_to 'Execute Comment', [comment.post, comment],
    :method => :execute %>

routes.rb
resources :posts do
  resources :comments do
    get :execute, :on => :member
  end
end

rake routes |grep execute
execute_post_comment GET    /posts/:post_id/comments/:id/execute(.:format) {:action=>"execute", :controller=>"comments"}

Error when I click Execute comment link:
No route matches "/posts/3/comments/6"

1条回答
Bombasti
2楼-- · 2020-06-25 05:14

run rake routes and see if there are any routes pointing to your controller action. If not you'll need to create one either as a "member action" or with a match rule.

If you do see the route, you can name it by passing an :as => route_name parameter to the routing rule. Doing so will enable the route_name_path() and route_name_url() helpers for your link_to

RailsCasts has a good quick rundown of the rails 3 routing syntax here

EDIT:

based on the code examples, try this :

<%= link_to 'Execute Comment', execute_post_comment_path(comment.post, comment) %>

According to the docs here the :method option can only contain valid http verbs (get, put, post, delete). The link_to helper can't puzzle out which action you want to hit with a custom member action, so you have to use the named route as above.

HTH

查看更多
登录 后发表回答