2017-04-24 56 views
0

在我的應用程序中,硬幣可能屬於或可能不屬於網絡。因此,我已在我的routes.rb如下:將多條路徑匹配到單個控制器動作

resources :coins 

resources :networks do 
    resources :coins 
end 

您可以通過硬幣#遵循遵循coins,並通過硬幣#取消關注

這是工作得很好,其通過屬於網絡硬幣Unfollow他們:

match 'networks/:network_id/coins/:id/follow', to: 'coins#follow', via: 'get', :as => :follow_coin 

match 'networks/:network_id/coins/:id/unfollow', to: 'coins#unfollow', via: 'get', :as => :unfollow_coin 

我想做到這一點還有:

match 'coins/:id/follow', to: 'coins#follow', via: 'get', :as => :follow_coin 

match '/coins/:id/unfollow', to: 'coins#unfollow', via: 'get', :as => :unfollow_coin 
Invalid route name, already in use: 'follow_coin' You may have defined two routes with the same name using the `:as` option, or you may be overriding a route already defined by a resource with the same naming. 

我對正確的解決辦法是什麼還不清楚:不過我參觀時coins/coinname,例如收到此錯誤。我想將networks/:network_id/coins/:id/followcoins/:id/follow映射到coins#follow操作,該操作已經準備好處理屬於網絡的硬幣以及不屬於網絡的硬幣。

我懷疑,即使有:

match 'networks/:network_id/coins/:id/follow', to: 'coins#follow', via: 'get', :as => :follow_coin 

我可以做這更好的與networks資源

回答

1

除了什麼海化說(偉大的建議!),你可能只是做:

resource :coins do 
    member do 
    put :follow 
    put :unfollow 
    end 
end 

然後,當你想使用network_id,這樣做(假設你定義了一個@coin變量):

follow_coin_path(network_id: network_id) 

,這將給你像:

/coins/2/follow?network_id=1 

而且你會PARAMS是這樣的:

{..., id: 2, network_id: 1, ...} 

由於聽起來您已經有邏輯來確定network_id參數是否存在。

如果你正在嘗試使用coinname爲識別變量(而不是id),然後像做:

resources :coins, param: :coinname do 
    member do 
    put :follow 
    put :unfollow 
    end 
end 

當你做rake routes,你應該看到類似:

follow_coin PUT /coins/:coinname/follow(.:format)  coins#follow 
unfollow_coin PUT /coins/:coinname/unfollow(.:format)  coins#unfollow 
     coins GET /coins(.:format)       coins#index 
       POST /coins(.:format)       coins#create 
     new_coin GET /coins/new(.:format)      coins#new 
    edit_coin GET /coins/:coinname/edit(.:format)   coins#edit 
      coin GET /coins/:coinname(.:format)    coins#show 
       PATCH /coins/:coinname(.:format)    coins#update 
       PUT /coins/:coinname(.:format)    coins#update 
       DELETE /coins/:coinname(.:format)    coins#destroy 

而你的參數將包含類似於:

{..., coinname: 'bitcoin', ...} 

此外,當你使用link_to,記得做:

link_to("Follow #{@coin.name}", follow_coin_path(@coin), method: :put) 

如果你不使用method: :put,然後link_to生成get。你會以No route matches [GET] "/coins/coinname/follow"錯誤結束。

+0

謝謝!我認爲這是正確的軌道。我按照你的說法做了,但是當我做了沒有網絡ID的追隨幣路徑(對於不屬於網絡的硬幣),我得到這個路由錯誤:'沒有路由匹配[GET]「/ coins/coinname/follow」 – libovness

+0

我不確定'coinname'來自哪裏。你嘗試過'follow_coin_path(@coin)'(假設你有'@ coin'定義)? – jvillian

+0

「coinname」只是變量。 'coin#show'實際上就是'coin/bitcoin'。當我插入'<%= link_to(「Follow #{@coin.name}」,follow_coin_path(@coin)%>它鏈接到'硬幣/比特幣/跟隨',我得到路線錯誤 – libovness

1

這是確定設置相同controller#action爲不同的URL。

但它們應該有不同的route helper,所以在rails視圖或控制器中,我們可以爲它們生成相應的url。

更改密碼這個

match 'networks/:network_id/coins/:id/follow', to: 'coins#follow', via: 'get', :as => :network_follow_coin 
match 'coins/:id/follow', to: 'coins#follow', via: 'get', :as => :follow_coin 

因此,當使用network_follow_coin(network_id, coin_id),它生成的URL /networks/1/coins/2/follow

當使用follow_coin_path(coin_id)時,它生成url /coins/2/follow

至於簡化代碼,你應該使用resource更好的包裝和理解,減少使用match(實際上我認爲從來沒有)。改變這種方式

resource :networks do 
    resource :coins do 
    member do 
     put :follow 
     put :unfollow 
    end 
    end 
end 

而另一件事是,如果你在你的數據庫改變的東西,你不應該設置http methodget。如果是get方法,它假設只取數據,不做修改。這也很危險,因爲一些蜘蛛會繼續訪問您網站中的每個鏈接,這可能會激活一些不好的事情。

相關問題