如何动态创建rails link_path?

时间:2014-11-02 06:13:45

标签: ruby-on-rails ruby-on-rails-4

所以我有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_pa​​th&#34;,而不是/confirmed

有什么想法吗?

修改1

所以我想出了一个解决方案,但我对其他选择感到好奇:

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

完美无缺。

还有其他方法吗?更多&#34; Railsy&#34;方式是什么?

2 个答案:

答案 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