有没有更优雅的方式来写这个? activerecord中的变量不是零

时间:2012-01-13 03:50:00

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

我ruby on rails,在视图中,我想检查是否有一些变量不为null。 我想首先我必须检查是否有一个对象,然后检查是否r1!= nil。 有没有更好的办法? 谢谢

      <% neki=Anketare.where("semestar_id=? AND JMBAG=? AND sifPred=? and vrstaNastave=?",session[:semestar_id],predmett.JMBAG,params[:format],Vrstanastave.find(1).vrstaNastave) %>
  <% if neki.exists? %>
    <% if neki.first.r1!=nil %>
        A+
    <% else %>
    A-
    <% end %>       
    <% else %>
    A-
    <% end %>       

4 个答案:

答案 0 :(得分:2)

使用ternary operator,我建议使用

模型或控制器! -

@neki=Anketare.where("semestar_id=? AND JMBAG=? AND sifPred=? and vrstaNastave=?",
session[:semestar_id],predmett.JMBAG,params[:format],
Vrstanastave.find(1).vrstaNastave)

查看:

<%= @neki.exists? ? (@neki.first.r1!=nil ? "A+" : "A-") : "A-" %>  

可能有用。

您需要@在控制器和视图之间共享变量。

答案 1 :(得分:2)

您可以使用foo.nil?来测试某些内容是否为零。所以你可以打电话给neki.first.r1.nil?测试它是否为零。您也可以将项目本身用作布尔测试:

if neki.first.r1; do_something; else; do_something_else; end

使用rails,您还可以使用foo.blank?检查某些内容是否为nil且不是空字符串或空数组。 Rails还会让foo.present?检查某些内容是否blank?(与!foo.blank?相同)

因此,在您的情况下,您只需将整个if语句集更改为:

<%= (neki.present? and neki.first.r1) ? "A+" : "A-" %>

答案 2 :(得分:1)

唉。使用andand gem

<%= @neki.andand.first.r1 ? "A+" : "A-" %>

答案 3 :(得分:1)

我不会在视图中包含任何逻辑。相反,您可以编写一个模型,在nekineki.first.r1上执行逻辑并计算成绩,然后从您的视图中调用它。

示例:

# Model
class Neki
  def initialize(neki)
    @neki = neki
  end
  def grade
    (neki.present? and neki.first.r1) ? "A+" : "A-"
  end
end

# Controller
@neki = Neki.new(Anketare.where(...))

# View
<%= @neki.grade %>

希望这有帮助!