【问题标题】:Conditional link_to do block有条件的 link_to 做块
【发布时间】:2014-10-02 13:31:33
【问题描述】:

也许这比我想象的要简单,但我在让它工作时遇到了问题。我有一个 link_to 块

<%= link_to(@animal.previous_animal, {class: 'prev-page'}) do
  <span class="glyphicon glyphicon-chevron-left"></span> Meet <span class="name"><%= @animal.previous_animal.name %></span>, the <%= animal_breed(@animal.previous_animal) %>
<% end %>

但如果previous_animal 存在,我只想显示链接

def previous_animal
 animal = self.class.order('created_at desc').where('created_at < ?', self.created_at)
 animal.last if animal
end

通常在link_to中我可以做到

<%= link_to(@animal.previous_animal) if @animal.previous_animal %>

但是当我添加 if 子句时,我得到了未定义的方法 'name',所以它仍在运行 ,即使我认为它在 if 语句中?

<%= link_to(@animal.previous_animal, {class: 'prev-page'}) if @animal.previous_animal do
  <span class="glyphicon glyphicon-chevron-left"></span> Meet <span class="name"><%= @animal.previous_animal.name %></span>, the <%= animal_breed(@animal.previous_animal) %>
<% end %>

【问题讨论】:

  • 您应该在控制器中定义@animal@previous_animal@next_animal。然后你的逻辑可以查询这些变量。您也可以一键加载它们。
  • 喜欢@previous_animal = Animal.previous_animal?举个例子
  • @previous_animal = @animal.previous_animal

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


【解决方案1】:
<% if @animal.previous_animal %>
  <%= link_to(@animal.previous_animal, class: 'prev-page') do %>
    <span class="glyphicon glyphicon-chevron-left"></span> Meet <span class="name"><%= @animal.previous_animal.name %></span>, the <%= animal_breed(@animal.previous_animal) %>
  <% end %>
<% end %>

【讨论】:

  • 谢谢,我早点试过了,但不高兴,所以我提出这个问题,以为我快疯了......,肯定有错字,反正一切正常
【解决方案2】:

您的 link_to if 块令人困惑,它会给您带来问题,因为即使没有记录,您也会渲染内容。我会这样做:

#controller
@animal = Animal.find_by_id(params[:id])
@previous_animal = @animal && @animal.previous_animal
@next_animal = @animal && @animal.next_animal

#view
<% if @previous_animal %>
  <%= link_to(@previous_animal, {class: 'prev-page'}) do
    <span class="glyphicon glyphicon-chevron-left"></span> Meet <span class="name"><%= @previous_animal.name %></span>, the <%= animal_breed(@previous_animal) %>
  <% end %>
<% else %>
  <!-- anything you might want to render if there's no previous animal -->
<% end %>

你的 previous_animal 方法也可以整理一下。

#model
def previous_animal
  Animal.order('created_at desc').where('created_at < ?', self.created_at).first
end

def previous_animal
  Animal.order('created_at').where('created_at > ?', self.created_at).first
end    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-12
    • 1970-01-01
    • 1970-01-01
    • 2020-12-21
    • 1970-01-01
    相关资源
    最近更新 更多