Techioz Blog

地理コード化されたリストからフォームに選択オプションを作成するにはどうすればよいですか?

概要

何かをジオコーディングするのはこれが初めてです。非常に多くの異なるオプションを試したので、何を試したかを見失ってしまいました。州内のすべてのジムをリストする Gym.rb モデルがあります。 Rails geocoder gemを使用してユーザーの住所から検索し、ユーザーの住所から16マイル以内にあるすべてのジムを取得しています。次に、10 マイル以内にあるジムの名前だけを取得し、f.select :gym1 の形式に入れたいと思います。やり方が分かりません。 Rails7を使用します。

ジムモデル:

  class Gym < ApplicationRecord

  geocoded_by :address
  after_validation :geocode

  def address
    [street, city, state, zip].compact.join(", ")
  end

  def address_changed?
    street_changed? || city_changed? || zip_changed? || state_changed?
  end
end

Rails コンソールで次を実行します。

@gyms = Gym.near(["current_user.latitude, current_user.longitude"], 10)

そして、次のようにしてジムのリストを返します。 ID: 名前: 住所:

ジオコーダーのドキュメント: Geocoder::Result オブジェクト、結果

ここでジム名だけを取り出して選択配列に入れる方法がわかりません。各ジム名にアクセスするには、「result.first.name」と記述し、2 番目の名前として「result.second.name」を記述する必要があります。

そのリストを取得したら、次のように @instance 変数に割り当てます。 @local_gym_list = [結果.最初の名前, 結果.二番目.名, …]

次に、静的な @local_gym_list を使用して、次の形式で実行してみました。

<%= f.select :gym1, [@local_gym_list] %>

しかし、それは機能しません。誰かがジオコード検索名を@local_gym_listに入れて、それをフォーム内のセレクターにする方法を教えてくれませんか?

解決策

座標ではなく文字列「current_user.latitude, current_user.longitude」をメソッドに渡します。

まずはバグを修正することから始めます。

@gyms = Gym.near([current_user.latitude, current_user.longitude], 10)

次に、リファクタリングします。

class User
  # ...
  def coordinates
    [latitude, longitude]
  end 
end

@gyms = Gym.near(current_user.coordinates, 10)

ここで選択を作成することは、他のレコードのコレクションの場合と何ら変わりません。

Rails が提供するコレクション ヘルパーを使用し、作成する入力の名前、コレクション、value メソッド、および label メソッドを渡すだけです。

<%= f.collection_select(:gym_id, @gyms, :id, :name) %>

Ruby では、配列に次々と手動で代入する必要はありません。自分が人間のコンパイラであることに気づいたら、立ち止まって考え直してください。

名前の配列を作成する必要がある場合 (実際には作成しません)、 .map(&:name) を実行するか、 .pluck(:id, :name) を使用して、必要な 2 つの属性を取得できます。