Ruby缩短if语句:if item present THEN查找item的属性

时间:2016-03-04 00:07:27

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

现在我的if语句看起来像这样:

angular.module('test', [])
  .controller('myCtrl', function($scope, $sce){
    $scope.char = $sce.trustAsHtml('ALK-Abelló A/S') 
  })
  .directive('trustedHtml', ['$sce', function($sce) {
    return {
      require: 'ngModel',
      link: function(scope, element, attrs, ngModel) {
        ngModel.$formatters.push(function(value) {
          function htmlDecode(input){
            var elem = document.createElement('div');
            elem.innerHTML = input;
            return elem.childNodes.length === 0 ? '' : elem.childNodes[0].nodeValue;
          }
          return htmlDecode(value);
        });
      }
    }
  }])

因此,如果找到<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script> <!DOCTYPE html> <html> <head> <script data-require="angular.js@1.4.8" data-semver="1.4.8" src="https://code.angularjs.org/1.4.8/angular.js"></script> <link rel="stylesheet" href="style.css" /> <script src="script.js"></script> </head> <body ng-app="test"> <div ng-controller="myCtrl"> ALK-Abell&#243; A/S <br> <input trusted-html ng-model="char"/> </div> </body> </html>,请检查其if User.find(user[:id]).present? && User.find(user[:id]).status_id != nil ... end 。之所以这样,是因为当我在无法找到的用户上检查status_id时,我不想抛出异常。但是想知道是否有更清洁的方法来做到这一点......

4 个答案:

答案 0 :(得分:1)

.find如果找不到则抛出异常。

请改为尝试:

user = User.where(id: user[:id]).first
if user.present? && user.status_id != nil
   ...
end

答案 1 :(得分:0)

看起来你已经有了一个用户对象,所以直接使用它而不是再次查询数据库:

def download_image(url, filename, output_dir_name):
    if not os.path.exists(output_dir_name):
        os.makedirs(output_dir_name)
    conn = urllib.request.urlopen(url)
    output = open(os.path.join(output_dir_name, filename), 'wb')  # binary flag needed for Windows
    output.write(conn.read())
    output.close()

答案 2 :(得分:0)

您可以使用专为此类情况设计的try

if User.find_by_id(user[:id]).try(:status_id) != nil

来自文档:

  

调用名称作为第一个参数的公共方法,就像public_send一样,除非接收者没有响应,否则调用返回nil而不是引发异常。

     

此方法被定义为能够写

@person.try(:name)
     

而不是

@person.name if @person

我还将User.find更改为User.find_by_id,因为如果找不到记录(而不是引发异常),则返回nil

答案 3 :(得分:0)

Active Record文档说

  

find方法将引发ActiveRecord :: RecordNotFound异常   除非找到所有提供的主要的匹配记录   密钥。

看起来您可能想要第一种方法,因为它不会引发异常。