我正在进入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"}
答案 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操作(通常与发布表单相关联,如create
和update
)。要发送帖子,您可能需要更改视图中的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.rb
将incvotes
行动的路线添加为post
:
resources :posts do
member do
post 'incvotes'
end
end
在您的控制器中,创建incvotes
操作:
def incvotes
# Something
redirect_to :posts
end