Simple_form路径问题

时间:2015-02-09 01:55:31

标签: ruby-on-rails simple-form rails-routing

以下是我的看法:

<%= 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"}

可能导致这种情况的原因是什么?如何使其工作,以便用户可以从集合中选择一位艺术家并为该艺术家投票?

1 个答案:

答案 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并保持名称不变。