以下是我的看法:
<%= simple_form_for :artist, :url => url_for(:action => 'upvote', :controller => 'artists'),
:method => 'post' do |f| %>
<%= f.input :choose_an_artist, :selected => "first artist", collection: [["first artist", 1], ["second artist", 2], ["third artist", 3], ["fourth artist", 4]] %>
<%= f.submit "Vote" %>
<% end %>
我的艺术家控制器:
def upvote
@artist = Artist.find(params[:choose_an_artist])
@artist.liked_by current_user
respond_to do |format|
format.html {redirect_to :back }
end
end
routes.rb中:
resources :artists do
member do
put "like", to: "artists#upvote"
end
end
我收到以下错误:
No route matches {:action=>"upvote", :controller=>"artists"}
可能导致这种情况的原因是什么?如何使其工作,以便用户可以从集合中选择一位艺术家并为该艺术家投票?
答案 0 :(得分:1)
您的代码中存在以下几个问题:
首先,您将路线定义为PUT
并且您正在强制执行
simple_form
生成POST
表单。更改method: :post
在您的视图中method: :put
,您应该全部设置。
其次,您需要根据控制器和操作名称定义路线:
resources :artists do
member do
put :upvote
end
end
第三,您将路线定义为on: :member
。这意味着它需要artist_id
来生成。在您的设置中,您需要定义路线on: :collection
。我还最好使用路径路径方法而不是url_for
,这样可以更容易地发现此错误。
resources :artists do
collection do
put :upvote
end
end
更改url_for
的{{1}}部分(如果这是update_artists_path
的正确路线)。
与您的问题无关的另一个问题:rake routes
不是:choose_an_artist
模型中定义的属性。渲染表单时,这将导致另一个错误。
我要根据您选择的实际属性名称重命名,Artist
并相应地更改控制器(我的选择),或者将表单助手从:id
更改为非模型相关select_tag
并保持名称不变。