Rails创建条件link_to的最佳方法

时间:2012-11-20 07:13:03

标签: ruby-on-rails ruby ruby-on-rails-3

我有下面的link_to标记,我很好奇创建此链接的​​最佳方法是什么,还检查first_name和last_name是否为nil?

如果只有一个名字是nil(第一个或最后一个),我仍然想要一个链接。

<%= link_to "#{u.user_details.first_name+" "+u.user_details.last_name}", profile_path(u), :class => 'name' %>

6 个答案:

答案 0 :(得分:4)

实现这一目标的一种简洁方法是

class UserDetails
  def full_name
    [self.first_name,
     self.last_name].compact.join(' ')
  end
end

然后,在控制器中

<%= link_to(u.user_details.full_name,
            profile_path(u),
            :class => 'name') if u.user_details.full_name.present? %>

使用link_to_if,如果条件未填充,则会返回'name'参数,并且您不需要它,因为它将是一个空字符串。

答案 1 :(得分:1)

根据我的口味,视图中的代码太多了。我更喜欢使用模型和助手:

# user_details.rb
def full_name
  "#{first_name} {last_name}"
end

# helper.rb
def my_link_to(user)
  name = user.user_details.full_name
  return "" if name.blank?
  link_to name, profile_path(user), :class => 'name'  
end

# view.erb
<%= my_link_to user %>

答案 2 :(得分:0)

您可以使用这样的锚字符串:"#{[u.user_details.first_name, u.user_details.last_name].join(' ')}"

首先查看#join的工作原理。

此解决方案的缺点是,即使没有提供用户详细信息,也会创建链接,但它将具有空锚字符串。

答案 3 :(得分:0)

一种工作方法是:

<%= link_to "#{u.user_details.first_name+" "+u.user_details.last_name}", profile_path(u), :class => 'name' if u.user_details.first_name.blank? or u.user_details.last_name.blank?  %>

但我不确定这是最好的方式......

答案 4 :(得分:0)

快速:

<%= link_to_if u.user_details.first_name || u.user_details.last_name,
[u.user_details.first_name, u.user_details.last_name].compact.join(' '),
profile_path(u), :class => 'name' %>
但是,我可能会将其重构为:

<% a = [u.user_details.first_name, u.user_details.last_name].compact %>
<%= link_to_unless a.empty?, a.join(' '), profile_path(u), class: 'name' %>

答案 5 :(得分:0)

我还会检查它们不是blank并使用join

<% name = [u.user_details.first_name, u.user_details.last_name].reject(&:blank?).join(" ") %>
<%= link_to name, profile_path(u), :class => 'name' unless name.blank? %>