2017-06-05 9 views
0

私のユーザオブジェクトを別のクラスに渡して検証することができるようにしたい。アプリ/モデル Railsアクティブなレコードのヌルがクラスに渡された後

Class UserHelper 

def initialize(user) 
    @user = user 
end 

def isAdmin 
    if @user.isadmin 
    true 
    end 
    nil 
end 

ザ・コントローラ内の文は、常に私はレコードが正しいことを知っているにもかかわらず、nilに解決されている場合で

def new 

    user = User.find(1) 
    logger.info "#{user.id}, #{user.name}, #{user.isadmin}" 
    #The above is logged with 1, test, true 
    uhelper = UserHelper.new(user) 
    if !uhelper.isAdmin 
    #Only admins can access this page 
    redirect_to root_path 
    end 

end 

:基本的に私は私のコントローラ

ような何かを行います。 ActiveRecordをそのようなクラスに正しく渡すことはできませんか?

これはなぜ起こっているのでしょうか?

編集

undefined method `isadmin' for nil:NilClass 
app/models/userfnc.rb:14:in `isAdmin' 
app/controllers/rosters_controller.rb:12:in `index' 

sqlite> select * from users; 
1|testuser|[email protected]|20170601|20170601|1 

sqlite> .schema users 
CREATE TABLE "users" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "name" varchar DEFAULT NULL, "email" varchar DEFAULT NULL, "created_at" datetime NOT NULL, "updated_at" datetime NOT NULL, "isadmin" boolean); 
+0

'isAdmin'はあなたに指示したので常に' nil'を返します。 'nil'がelseレスポンスでなければ' is ... else ... end'を使うように 'isAdmin'メソッドを再構築します。また、 'ActiveRecord'ブール値の場合、標準的な規則は"ブーリアンメソッド "を' @ user.isadmin'ではなく '@ user.isadmin?'(最後に疑問符を付けて)と呼ぶことです。最後に 'userfnc'とは何ですか? "app/models/user.rb"または "app/helpers/user_helper.rb"のいずれかである必要があります – engineersmnky

答えて

1

あなたのコードに使用することができ、コードの改善のかなりがあります。

あなたの問題に関しては、ケーシングがあなたを迎えている可能性があります。あなたのテーブルをチェックしてください。フィールドがisadminでなく、isAdminと表示されることがあります。あなたのコードの改善に関しては

、ここであなたを助けることができるものです:

def isAdmin 
    if @user.isAdmin 
    true 
    end 
    nil 
end 

あなたは1行でこれを実現できます。

def isAdmin 
    @user.isAdmin 
end 

このビットは、

uhelper = UserHelper.new(user) 
if !uhelper.isAdmin 
    #Only admins can access this page 
    redirect_to root_path 
end 

ますこのような簡単な表現があります。これを1行に減らす方が簡単な場合もあります:

uhelper = UserHelper.new(user) 
redirect_to root_path unless uhelper.isAdmin 

しかし...レールの規格は、この場合には、フィルタを使用することです。そのビットの代わりに、これをフィルターメソッドに入れます。

class MyController 
    before_filter :check_admin 
    ... 
    ... 
    private 
    def check_admin 
    redirect_to root_path unless user.isAdmin 
    end 
end 
+0

上記の編集をご覧ください – jacksonecac

関連する問題