1

関連付けられたモデル ユーザーに国 ID を設定するために、collection_select を 1 回だけ使用しました。ここで、別のビューで同じ collection_select ステートメントを使用してユーザーの検索を行い、選択した国のユーザーを一覧表示したいと思います。私の試みは失敗しました。国を選択した後にリンクを見ると、その国の ID が選択されていることがわかります。しかし、送信ボタンをクリックすると、collection_select ステートメントは、選択された値をデフォルトの選択された値にリセットし、選択された値を無視します。たとえば、フランスの国を選択すると、ID は 75 です。フランスを選択して [国で検索] をクリックすると、ID は次のように表示されます。

http://localhost:3000/users_admin?utf8=✓&query=&user%5Bcountry_id%5D=75

これは、collection_select ステートメントを含むフォームです。選択したcountry_idでUserモデルのレコードを追加/更新するときに正常に使用しているステートメントをコピーしました。ロジックで実行したいのは、国を選択して [国で検索] をクリックすると、選択した国がドロップダウン リストで選択されたままになり、選択した country_id を持つユーザー レコードが画面に表示されることです。名前による検索は期待どおりに機能します。

<%= form_tag users_admin_path, method: 'get' do %>
  <p style="padding-left: 20px;">
    <%= text_field_tag :query, params[:query], placeholder: "Search for first, last or full name" %>&nbsp;&nbsp;
    <span valign="center"><%= submit_tag "Search by Name", class: "btn btn-medium btn-custom", :name => nil %></span>&nbsp;&nbsp;&nbsp;&nbsp;
    <%= collection_select(:user, :country_id, Country.order('name'), :id, :name, {:selected => 233}) %>&nbsp;&nbsp;
    <span valign="center"><%= submit_tag "Search by Country", class: "btn btn-medium btn-custom", :name => nil %>
  </p>
<% end %>

これが私のコントローラーのコードです。

def users_admin
  case
  when User.where("active_user = ?", '1').count > 0 # blocked users exist
    @users = User.where("active_user = ?", '1').all
  when params[:commit]=='Search by Country'
    @users = User.where("country_id = ?", params[:country_id]).all
  else
    @users = User.text_search(params[:query])
  end 
  @microposts = Micropost.all
end

問題が collection_select ステートメントのコーディング方法にあるのか、それとも別のロジックの問題にあるのかはわかりません。私が最初に考えたのは、collection_select ステートメントから選択した値を何らかの方法で保存し、それを where 句で使用する必要があるということでした。しかし、それを行うためにステートメントを再コード化する方法がわかりません。また、画面が最初に表示されたときに米国である 233 としてデフォルトで選択された値も持っています。また、1 つではなく 2 つの異なるフォームを使用する必要があるのではないかと考えました。この時点で進むべき方向がわかりません。

この問題に関する質問については、主にスタック オーバーフローを検索しました。ほとんどの場合、collection_select に関する質問は、私がおそらくこれまでに使用したことのない用途に関するものでした。ここでも、collection_statement を 1 回だけ使用しました :)

どんな助けでも大歓迎です。

4

2 に答える 2

0

さらに検索を行った後、ハッシュに何が含まれているかを確認するために、ビューにパラメータを表示することにしました。submit_tagにコミットがなかったので、params [:country_id]が存在するかどうかを確認するように変更しました。変更したコードで国検索を機能させることができました。

case
  when User.where("active_user = ?", '1').count > 0 # blocked users exist
    @users = User.where("active_user = ?", '1').all
  when params[:country_id].present?
    @users = User.where("country_id = ?", params[:country_id].to_i).all
  else
    @users = User.text_search(params[:query])
end 

私が残した唯一の問題(マイナーな問題)は、国の検索後に名前検索を正しく機能させるために、その人が国のリストで空白のエントリを選択する必要があることです。それ以外はこれで解決します。params [:country_id]の値を消去する方法を理解するのにそれほど時間はかからないはずです。それか私はparams[:query] .presentの暗黙のチェックを行うかもしれませんか?。ご協力いただきありがとうございます。もう一組の目は確かに助けになりました。

于 2012-12-20T22:27:14.353 に答える
0

collection_select は、フォームでモデルを操作する場合に使用する必要があります (つまり、 を使用form_for @user doしない場合)。form_tag

次のようなことを試してください:

<%= select_tag :country_id, options_from_collection_for_select(Country.all, :id, :title, params[:country_id]), include_blank: true %>

そこのparams[:country_id]パラメーターは、ユーザーが検索フォームを送信した後、GET リクエストを介して渡された country_id がドロップダウンで選択されるようにします。

ところで、form_for関係するモデルがある場合(作成/更新中)に使用されます。検索フォームを作成している場合、これは当てはまらず、使用する必要がありますform_tag

詳細については、こちらをお読みください: http://guides.rubyonrails.org/form_helpers.html#making-select-boxes-with-ease

于 2012-12-19T23:36:19.473 に答える