我有下面的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' %>
答案 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? %>