2

current_userヘルパーでDeviseを使用するこのアプリケーションがあります。モジュールを作成すると、それが決して起こらないのに、それへの帰属を言及した後にcurrent_userなります。nil

class PagesController < ApplicationController
  include ModuleTest

  def index
    a_test_method
  end
end

そしてModuleTest :

module ModuleTest
  extend ActiveSupport::Concern

  def a_test_method
    puts "(BEFORE)===========> #{current_user.inspect}"
    current_user = nil if false
    puts "(AFTER) ===========> #{current_user.inspect}"
  end
 end

出力:

(BEFORE)===========> #<User id: 1>
(AFTER) ===========> nil

ただし、この行を削除/コメントアウトすると# current_user = nil if falsecurrent_user有効なままになります。

(BEFORE)===========> #<User id: 1>
(AFTER) ===========> #<User id: 1>

これは、遅延評価と多少関係がありますか?

編集

全体の問題は、ステートメントが評価されない場合に Ruby が変数を定義する方法に依存しています。

2.3.4 (main):0 > defined? this_never_seen_variable_before
=> nil
2.3.4 (main):0 > this_never_seen_variable_before = "value" if false
=> nil
2.3.4 (main):0 > defined? this_never_seen_variable_before
=> "local-variable"
2.3.4 (main):0 >
2.3.4 (main):0 > this_never_seen_variable_before_2
   NameError: undefined local variable or method `this_never_seen_variable_before_2' for main:Object
from (pry):119:in `<main>'
2.3.4 (main):0 > this_never_seen_variable_before_2 = "value" if false
=> nil
2.3.4 (main):0 > this_never_seen_variable_before_2
=> nil
2.3.4 (main):0 >

これは下でどのように機能しますか?

4

1 に答える 1

2
  1. current_userローカル変数ではなく、Deviseが提供するヘルパーメソッドです。

  2. という名前のヘルパー メソッドはありませんcurrent_user=current_user = nilこれは、に変更しself.current_user = nilてクラッシュすることで証明できます。しかし、これはあなたの問題とは無関係です。

その結果current_user、 2 の間にローカル変数を定義putsし、同じ名前のヘルパー メソッドをシャドウします。

奇妙なことに、current_user = nilは のために実行されませんがif false、ローカル変数はまだ定義されており、その値は暗黙的に に設定されていnilます。これが、2番目のputsショーがnil. に変更current_user = nilしてもcurrent_user = :someone、2 番目のputs値は のままですnil

于 2017-12-01T05:53:56.153 に答える