関連付けられたモデル ユーザーに国 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" %>
<span valign="center"><%= submit_tag "Search by Name", class: "btn btn-medium btn-custom", :name => nil %></span>
<%= collection_select(:user, :country_id, Country.order('name'), :id, :name, {:selected => 233}) %>
<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 回だけ使用しました :)
どんな助けでも大歓迎です。