2014-11-02 43 views
0

所以我有3條路徑我要生成的鏈接:如何動態創建rails link_path?

confirmed_path GET /confirmed(.:format) posts#status {:status=>"confirmed"} 
unconfirmed_path GET /unconfirmed(.:format) posts#status {:status=>"unconfirmed"} 
corroborated_path GET /corroborated(.:format) posts#status {:status=>"corroborated"} 

在我看來,我的渲染有關span有這樣的鏈接:

<span class="post-status status label<%=render partial: "shared/color", locals: {post: post.status }%>"><%= link_to post.status.try(:upcase), "#" %></span> 

我想會發生什麼是,沒有使用不合適的if/case語句.... link_to的路徑部分,如果post.status ==「確認」,我希望它產生confirmed_path

我不能完全弄清楚如何獲得字符串插值對於這種類型的問題......工作beause當我嘗試:

link_to post.status.try(:upcase), "#{post.status}_path" 

它的字面生成HTML「confirmed_pa​​th」,與/confirmed

有什麼想法?

編輯1

所以我想通了一個解決方案,但我很好奇其他選項:

link_to post.status.try(:upcase), "#{post.status.html_safe}" 

完美的作品。

還有別的辦法嗎?更「Railsy」的方式?

回答

1

有了這個,

link_to post.status.try(:upcase), "#{post.status}_path" 

的第二個參數link_to是一個字符串。你實際想要做的是調用方法(例如confirmed_path),其名稱將在字符串插值後確定。

link_to post.status.try(:upcase), send("#{post.status}_path") 

此外,由於你的路由映射到相同的動作,你可以定義一個路由,而不是三個。

get '/:status', to: 'posts#status', constraints: { status: /confirmed|unconfirmed|corroborated/ }, as: :status 

然後,在你的意見,你可以這樣做,

<%= link_to post.status.try(:upcase), status_path(status: post.status) %> 
+0

非常好。這很好地工作。謝謝! – marcamillion 2014-11-02 09:12:15

0

嘗試:link_to post.status.try(:upcase), post.status

+0

這沒有奏效。這只是輸出相同的東西(即「確認」與'/確認'的實際路徑)。 – marcamillion 2014-11-02 08:51:55