1

叫ばないでください...データベースでFirstnameを見つけるために検索クエリを実行しようとしています。基本的には、特定のユーザーを見つけて、そのユーザーを表示しようとしています。

コンソールで機能するのは Client.where ですが、これをコントローラーで機能させることができないようです。

irb(main):001:0>client = Client.where("name = 'Dusty'")
Client Load (0.4ms)  SELECT `clients`.* FROM `clients` WHERE (name = 'Dusty')

私が持っているのは。

ビュー「index.html.erb」:

<%= form_for :find_it do |n| %>
   Name: <%= n.text_field :text, :cols => "30", :rows => "1" %></br>
<%= n.submit "Find" %>

client_controller.rb のコントローラー メソッド:

def find_it
  @post = Clients.all
  @post = Client.where("name = ", params[:find_it])
  @post = Client.find(params[:id])
end

任意の支援をいただければ幸いです。

4

3 に答える 3

4

あなたの構文は少しずれています。ハッシュ スタイルの条件を使用します。

def find_it
  @post = Client.where(:name => params[:find_it])
  # @post = Client.find(params[:id]) # why is this line here? It overwrites previous results
end
于 2013-01-30T07:15:42.927 に答える
3

これを行うにはいくつかの方法があります。

# with old hash syntax (all ruby versions)
@clients = Client.where(:name => params[:find_it])

# with new hash syntax (ruby 1.9)
@clients = Client.where(name: params[:find_it])

# with text query
@clients = Client.where('name = ?', params[:find_it])

それらはすべて同等です。

コードは、データベースからすべての@post = Client.allクライアントに変数@postを割り当ててから、完全に異なる値で 2 回再割り当てします。最後に、変数にはidが等しいレコードが割り当てられ、これがビューに表示されます。@postClientparams[:id]

また、一般的にメソッドを使用する必要はありませんall。次の点に注意してください。

Client.where(name: params[:find_it]).all.class
# => Array
Client.where(name: params[:find_it]).class
# => ActiveRecord::Relation

ActiveRecord::Relationこれは、他のクエリ方法でクエリできることを意味します。

@clients = Client.where(name: params[:find_it])
@favourite_clients = @clients.where(favourite: true)

Rails は何をすべきかを認識します (ActiveRecord::Relation何かを行う必要があるまで、つまり、ビューで結果を反復するまでは処理しません)。そのためall、コントローラーに配列が本当に必要な場合にのみ追加する必要があります。

@clientsの代わりに、より意味のある変数名を使用することも検討する必要があります@post

ソリューション全体に関しては、次のようになります。

# view
<%= form_for :find_it, :url => find_client_path do |n| %>
  Name: <%= n.text_field :text, :cols => "30", :rows => "1" %></br>
  <%= n.submit "Find" %>
<% end %>

form_for ドキュメントを見てください。params[:find_it]テキストが ではなくであることがわかりますparams[:find_it][:text]

:urlアクションへのパスにオプションを提供する必要がありますfind_it

インデックス ビューに結果を表示する場合は、次のようにします。

# view
<%= form_for :find_it do |n| %>
  Name: <%= n.text_field :text, :cols => "30", :rows => "1" %></br>
  <%= n.submit "Find" %>
<% end %>

# controller
def index
  @clients = Client.scoped
  @clients = @clients.where(:name => params[:find_it][:text]) if params[:find_it]
end
于 2013-01-30T08:21:16.273 に答える
2

交換

@post = Client.where("name = ", params[:find_it])

@post = Client.where("name = ?", params[:find_it])
于 2013-01-30T07:23:46.953 に答える