2017-11-30 19 views
0

ここで何か不足している可能性があります。私はここでレールキャストに従っています。簡単な検索がレールアプリで機能していない

私はモデルnameカラムと呼ばれるモデルを持っています。私のコントローラで

私は次のように検索するための新しい方法を追加しました:

productions_controller.rb

def index 
    @productions =Production.all 
    end 

    def search 
    if params[:search] 
     @productions = Production.find(:all, :conditions => ['name LIKE ?', "%#{params[:search]}%"]) 
    else 
     @productions = Production.all 
    end 
    end 

をそして私は、ルートファイルでこのアクションを追加しました:

resources :productions do 
    collection do 
     get 'search' 
    end 
    end 

私は検索フィールドを与えましたindex.html.erb

私が検索したときに
<%= form_tag productions_path, :method => 'get' do %> 
    <p> 
    <%= text_field_tag :search, params[:search] %> 
    <%= submit_tag "Search", :name => nil %> 
    </p> 
<% end %> 

そして私は今、検索アクション

search.html.erb

<table> 
    <thead> 
    <tr> 
     <th>Name</th> 
     <th>Director</th> 
     <th>Status</th> 
     <th colspan="3"></th> 
    </tr> 
    </thead> 

    <tbody> 
    <% @productions.each do |production| %> 
     <tr> 
     <td><%= production.name %></td> 
     <td><%= production.director %></td> 
     <td><%= production.status %></td> 
     <td><%= link_to 'Show', production %></td> 
     <td><%= link_to 'Edit', edit_production_path(production) %></td> 
     <td><%= link_to 'Destroy', production, method: :delete, data: { confirm: 'Are you sure?' } %></td> 
     </tr> 
    <% end %> 
    </tbody> 
</table> 

制作テーブル

create_table "productions", force: :cascade do |t| 
    t.string "name" 
    t.string "director" 
    t.integer "status" 
    t.datetime "created_at", null: false 
    t.datetime "updated_at", null: false 
    end 

のための上陸を作成しました名前の表のキーワード私はすべてのthを得ているeの名前は、たとえ入力されたキーワードにも近くない場合でも、テーブル内に存在します。

答えて

1

あなたはRails 2.3のクエリ構文を使用していますが、このレールキャストはひどく古いです。あなたはindexに検索フォームをルーティングするので、indexアクションでこのコードを配置する必要がありながらも、あなたは、searchアクションでそれを持って

@productions = Production.where('productions.name like ?', "%#{params[:search]}%") 

:それはより多くのようにする必要があります。

あなたはそれがsearchアクションに滞在する場合は、フォームのパスを変更する必要があります

<%= form_tag [:search, :productions], :method => 'get' do %> 
+0

あなたは提案のように、私はindexアクションでこれを追加しました。さて、** productionsで 'name'という列があると思っていました**このエラーはSQLite3 :: SQLException:no such column:production.name:SELECT" productions "です。 '%avatar%'のような名前) ' – user3576036

+1

@ user3576036申し訳ありませんが、私の間違いは、あなたのテーブル名は複数の「制作物」です。やってみよう。 –

+0

これは動作しています。しかし、インデックスメソッドの代わりに私は別のメソッドでそれをしたい。だからこそ私は 'search'という新しいメソッドを作成し、それをルートに追加しました。なぜそれが 'search'メソッドと連動しないのですか?そして、 'index'メソッドの代わりに' search'メソッドからどのように動作させることができますか? – user3576036

関連する問題