Ruby on Rails:link_to动作,没有路由匹配

时间:2011-05-18 20:39:42

标签: ruby-on-rails

我正在进入Rails并试图在博客设置中添加“投票”功能:http://guides.rubyonrails.org/getting_started.html

在app / controllers / posts_controller.rb中我创建了这个:

  def incvotes
    @post = Post.find(params[:id])
    post.update_attributes(:upvotes => 1 )
    format.html { redirect_to(@post, :notice => 'Vote counted.') }
    format.xml  { head :ok }
  end

在app / views / posts / index.html.erb中创建了这个:

<%= link_to 'Vote', :controller => "posts", :action => "incvotes", :id => post.id %>

但链接正在给出错误

  

没有路线匹配{:controller =&gt;“posts”,:action =&gt;“incvotes”,:id =&gt; 1}

我在这里遗漏了一些东西,但不确定是什么。

rake routes:

incvotes_post POST   /posts/:id/incvotes(.:format) {:action=>"incvotes", :controller=>"posts"}
        posts GET    /posts(.:format)              {:action=>"index", :controller=>"posts"}
              POST   /posts(.:format)              {:action=>"create", :controller=>"posts"}
     new_post GET    /posts/new(.:format)          {:action=>"new", :controller=>"posts"}
    edit_post GET    /posts/:id/edit(.:format)     {:action=>"edit", :controller=>"posts"}
         post GET    /posts/:id(.:format)          {:action=>"show", :controller=>"posts"}
              PUT    /posts/:id(.:format)          {:action=>"update", :controller=>"posts"}
              DELETE /posts/:id(.:format)          {:action=>"destroy", :controller=>"posts"}
   home_index GET    /home/index(.:format)         {:action=>"index", :controller=>"home"}
         root        /(.:format)                   {:action=>"index", :controller=>"home"}

4 个答案:

答案 0 :(得分:3)

我的猜测是,您可能在路径文件中没有定义控制器中定义的操作的定义。必须为Rails定义控制器中的操作和路由文件中的操作才能正确生成URL。

您的路线文件可能包含以下内容:

resources :posts

但是您希望添加的内容超过resources关键字生成的标准操作,请尝试以下操作:

resources :posts do 
  member do
    post 'incvotes'
  end
end

这告诉路由你在你的帖子控制器中有另一个动作,叫做incvotes接受HTTP post请求,只要它们指向具有正确动作的成员路由(/ posts / 14是成员路由,而/ posts /是一个'收集'路线)。所以你会有一条新的路线,可能就像/posts/14/incvotes一样,你可以张贴一张表格,一切都应该开始正常运作。

编辑:

实际上我想,因为您只是在模型上的属性上添加1,所以您不需要POST操作(通常与发布表单相关联,如createupdate)。要发送帖子,您可能需要更改视图中的HTML以包含表单并将其发布到正确的URL。您可以尝试这样做,或者您可以将路线文件更改为get 'incvotes'而不是post 'incvotes'。抱歉混淆,希望有所帮助!

答案 1 :(得分:3)

= link_to "vote", incvotes_post_path(post), :method=>:post

如果这不起作用,请尝试将方法更改为:put

答案 2 :(得分:1)

incvotes_post路由只接受HTTP POST,链接总是产生HTTP GET。

使用带有按钮的表单(或使用AJAX进行POST)。

答案 3 :(得分:0)

尝试使用button_to代替link_to

在您看来:

<%= button_to 'Vote', incvotes_post_path(post) %>

config/routes.rbincvotes行动的路线添加为post

resources :posts do 
  member do
    post 'incvotes'
  end
end

在您的控制器中,创建incvotes操作:

def incvotes
  # Something
  redirect_to :posts
end