【问题标题】:Rails best way to create a conditional link_toRails 创建条件链接的最佳方法
【发布时间】:2012-11-20 07:13:02
【问题描述】:

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

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

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

【问题讨论】:

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


【解决方案1】:

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

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'参数,您不需要它,因为它将是一个空字符串。

【讨论】:

    【解决方案2】:

    在我看来,视图中的代码太多。我更喜欢使用模型和助手:

    # 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 %>
    

    【讨论】:

    • "#{first_name} {last_name}",如果其中一个是空白的,你的full_name的开头或结尾会有一个空格。
    • 你说得对,应该是"#{first_name} {last_name}".strip
    【解决方案3】:

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

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

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

    【讨论】:

      【解决方案4】:

      一种工作方法是:

      <%= 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?  %>
      

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

      【讨论】:

        【解决方案5】:

        快点:

        <%= 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' %>
        

        【讨论】:

          【解决方案6】:

          我还会检查它们不是 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? %>
          

          【讨论】:

            猜你喜欢
            • 2011-05-14
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-05-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多