RailsでViewからのクラスメソッドの呼び出しについて


RailsでViewからのクラスメソッドの呼び出しについて教えて下さい。

インスタンス固有の値を持たないようなメソッドについて、クラスメソッドでもインスタンスメソッドでも呼び出しは出来ると思うのですが、どちらを利用するべきかで疑問がわきました。

MyClass.find_case(param1) のようなメソッドをfor分の中で呼び出すとします。

どちらのようにするのが正しいのでしょうか？

  1. コントローラーでインスタンス変数を作ってからviewから呼び出す。  
Controller  
`@my_class = MyClass.new`  
View  
`<%= @my_class.find_case(param1) %>`

  2. viewから直接呼び出す。  
View  
`<%= MyClass.find_case(param1) %>`

どちらでも動くと思うのですが、Viewから直接モデルのクラスを呼び出す事がなんとなく気持ち悪く質問させていただきました。

効率の面でも教えていただければ幸いです。




どちらでも動きますし、絶対どちらにしなければならないというルールはありませんが、後者の方がベターです。

やろうと思えばコントローラ内でいくらでもインスタンス変数を作ってビューに渡すことはできますが、コントローラとビューの間にコンテキスト（暗黙の前提条件）が増えてしまうので、インスタンス変数の定義はむしろ制限した方が良いです。

その際の大雑把なガイドラインとして、「HTMLではなく、JSON等のAPIとしてレスポンスを返すときに、そのインスタンス変数のデータを返却するか？」を考えてみるのがいいと思います。

たとえば `/books.json` であれば

[code]

    def index
      @books = Book.all
    end
    
[/code]

とするのは自然です。

しかし、

[code]

    def index
      @books = Book.all
      @my_class = MyClass.new
    end
    
[/code]

と書いた場合、おそらく `@my_class` はJSONとして返却する値にはならないと思います。

もちろん、例外的にJSONでは使わないような値をインスタンス変数としてビューに渡すケースはありますが、それは珍しいパターンだと思った方がいいでしょう。




どちらでも動きますし、絶対どちらにしなければならないというルールはありませんが、後者の方がベターです。

やろうと思えばコントローラ内でいくらでもインスタンス変数を作ってビューに渡すことはできますが、コントローラとビューの間にコンテキスト（暗黙の前提条件）が増えてしまうので、インスタンス変数の定義はむしろ制限した方が良いです。

その際の大雑把なガイドラインとして、「HTMLではなく、JSON等のAPIとしてレスポンスを返すときに、そのインスタンス変数のデータを返却するか？」を考えてみるのがいいと思います。

たとえば `/books.json` であれば

[code]

    def index
      @books = Book.all
    end
    
[/code]

とするのは自然です。

しかし、

[code]

    def index
      @books = Book.all
      @my_class = MyClass.new
    end
    
[/code]

と書いた場合、おそらく `@my_class` はJSONとして返却する値にはならないと思います。

もちろん、例外的にJSONでは使わないような値をインスタンス変数としてビューに渡すケースはありますが、それは珍しいパターンだと思った方がいいでしょう。

