2017-02-03 9 views
0

私のモデルには単純なselfメソッドが定義されています。コントローラ、モデル、ビュー。パラメータを渡すこととの混乱

def self.search(name, type) 
    #handle name 
    #handle type 
end 

私の混乱は、表示に関してです。&コントローラです。正しい値を渡す(正しい構文を使用する)。

ビューでは、単純な形式です。

<%= form_tag(index_path, method: :get) do %> 
    <%= label_tag :type, 'Type' %> 
    <% type_array = ["Foo", "Foo_One", "Foo_Two", "Foo_Three"] %> 
    <%= select_tag :type, options_for_select(type_array, selected: params[:type]), include_blank: true %> 

    <%= label_tag :name, 'Name' %> 
    <% name_array = ["Foo", "Foo_One", "Foo_Two", "Foo_Three"] %> 
    <%= select_tag :name, options_for_select(name_array, selected: params[:name]), include_blank: true %> 

    <%= submit_tag "Filter" %> 
<% end %> 

混乱options_for_select未満の 、それはselect_tag :searchまたはselect_tag :typeすべきですか?代わりにselected: params[:search]にする必要がありますか?

コントローラでの

def index 
    @foo = Foo.all 
    #variation 1 that i tried 
    @foo = @foo.search(params[:search]) if search(params[:search]).present? 
    #variation 2 that i tried 
    @foo = @foo.search(params[:name,:type]) if search(params[:name,:type]).present? 
    #variation 3 that i tried 
    @foo = @foo.search(params[:name][:type]) if search(params[:name][:type]).present? 
end 

混乱二つ バリエーション3種類は、私にはほとんど意味があります。しかし、私はself.searchが呼ばれるのを見ていません。また、それはエラーを投げます(SymbolからIntegerへの暗黙的な変換はありません)。

エラーが自分のフォームにもあるかどうかわかりません。

明らかに私は、どこにパラメータを渡してそれらを「収集」するのか熟知していません。私はRubyのドキュメントを読んでみましたが、それを理解するのは苦労しました。

私は、より大きな画像は、メソッドのフォームに適切な構文(または引数を収集する方法)とは何かと思いますか?

答えて

0

混乱1:あなたが実際のモデル属性に結び付けられていないように見えるので、select_tagsがあなたのケースで呼び出されても問題はありませんが、 '名前'と 'タイプ'入力フィールドのHTML属性の名前と型です。それでも、それはあなたがそれをやったやり方ではまだ動作し、選択されたオプションはうまく見えます。

混乱2:あなたはparamsハッシュから個別にアクセスする必要がある:

class FooClass 
    def self.search(name, type) 
    # blah 
    end 

これは、あなたができることを意味します」:しかし

@foo.search(params[:name], params[:type]) if params[:name].present? || params[:type].present? 

、あなたはほど自己メソッドとして定義していますクラスのインスタンス、つまり@ foo.searchにアクセスすると、クラス自体から呼び出されます。

FooClass.search(params[:name], params[:type]) if params[:name].present? || params[:type].present? 

あなたはとてもとして、「自己」を持っていなかった一方場合:あなたができる

class FooClass 
    def search(name, type) 
    # blah 
    end 

ザ・:

@foo = FooClass.new 
@my_var = @foo.search(params[:name], params[:type]) 
+0

バリエーション3と思われるように見えますが、「気分が良い」とはかなり近いです。 paramsを分離するだけでした。今の魅力のように動作します。ありがとう:) – angkiki

0

まずオフだけsearchに変更self.searchの中にあなたのindex方法ので、あなたのコントローラはFooモデルのインスタンスを使用しています。 self.methodはクラスレベルのメソッドであり、クラスのインスタンス(この場合はFooクラス)を作成しなくても基本的に動作します。

関連する問題