2016-11-22 4 views
0

コントローラーのチェックでif o.my_method('a')が正しく評価されますが、これが起きたときには@varはモデルにnilのままです。どこが間違っているのですか、それとももっと良い方法がありますか?Rubyコントローラを使用したモデルでインスタンス変数の値を設定する

コントローラー:

def action 
    o = Object.new 
    if o.my_method('a') 
    ... 
    end 
end 

モデル:あなたが持っていた

class MyModel 
    attr_accessor :example 

    VALID_VALUES = %w[ a b c ] 

    def demo_method(value) 
    @example = true if VALID_VALUES.include?(value) 
    end 
end 

model = MyModel.new 

model.demo_method('x') 

model.example 
# => nil 

model.demo_method('a') 

model.example 
# => true 

問題:

ここ
class Object 
    def my_method(args) 
    ['a', 'b', 'c'].any? do |i| 
     @var = true if args.include?(i) 
    end 
    end 

    def my_method2 
    if @var == true 
     do stuff 
    end 
    end 
end 
+1

なぜオブジェクトを 'Object'に追加していますか?それは通常、非常に危険であり、不十分である。また、 "モデル"を意味しますか? "Modal"は特定の専門用語です – tadman

+0

はい、申し訳ありませんがモデルを意味します。私はこれを行うための別の方法はわかりません。モデルは 'my_method'について知る必要はありませんが、コントローラですべてのことをすれば、結果を知るためにモデル(' my_method2')が必要ですモデルの中で実行されたかどうか、そのチェックの(真偽)です。 @ tadman –

答えて

1

は、実際に自然の中でより多くのRubyのようだあなたのコードのクリーンアップバージョンです元のコードでは、any?ブロック内の値を設定していますo含めるかどうかのテストを行います。このネスティングは必須ではありません。

もテストする必要はありません。xで十分です。

+0

返事をありがとう!これはほとんど動作し、 '@ example'は' demo_method'でtrueを返しますが、 '@ example'はモデルの他のどこかで呼び出すときにnilと思われます。 –

+0

何か提案がありますか?例: 'def demo_method2 @exampleの場合は" abc "を入れます。 end' –

+0

' model'のコンテキスト内でうまく動作します。別名、あなたの例では、 'model.example'です。しかし、実際にグローバル変数 '@ example'にアクセスしようとすると、それはゼロです。 @tadman –

関連する問題