2015-02-09 226 views
0

以下是我在我的觀點:Simple_form路徑問題

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

我ArtistsController:

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

有在你的代碼的幾個問題:

首先,定義您的路線PUT,你迫使 simple_form產生POST形式。在您的視圖中更改method: :postmethod: :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一部分update_artists_path(如果這是從rake routes正確的路線)。

不相關的問題,另一個問題::choose_an_artistArtist模型中定義的屬性。這會在呈現表單時導致另一個錯誤。

我要麼重命名每次您選擇,:id實際的屬性名稱並相應地改變控制器(我的選擇),或者從f.input改變窗體幫手相關select_tag非模型,並保留名字,因爲他們是。

+0

我只是嘗試這樣做,現在,我得到確切同樣的錯誤。有任何想法嗎? – 2015-02-09 02:16:25

+0

的錯誤都出現了,當我試圖渲染有它的形式來看,之前我甚至有機會嘗試提交表單。 – 2015-02-09 02:17:36

+0

你可以在控制檯中添加'rake routes''的結果嗎?我們正在尋找定義您給予好評的路線就行了。 – dgilperez 2015-02-09 02:31:16