所以我有3条路径要为其生成链接:
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
==&#34;确认&#34;,我想要它生成confirmed_path
。
我无法弄清楚如何让字符串插值适用于此类问题...因为我尝试的时候:
link_to post.status.try(:upcase), "#{post.status}_path"
它实际上生成HTML&#34; confirmed_path&#34;,而不是/confirmed
。
有什么想法吗?
修改1
所以我想出了一个解决方案,但我对其他选择感到好奇:
link_to post.status.try(:upcase), "#{post.status.html_safe}"
完美无缺。
还有其他方法吗?更多&#34; Railsy&#34;方式是什么?
答案 0 :(得分: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) %>
答案 1 :(得分:0)
尝试:link_to post.status.try(:upcase), post.status