4

IPアドレスを供給する必要があるモデルから別の関数を呼び出す関数がコントローラーにあります

  def get_location_users
    if current_user
      return current_user.location_users
    else

      l = Location.find_by_ip(request.remote_ip)

      lu = LocationUser.new({:location_id => l.id, :radius => Setting.get("default_radius").to_i})
      return [lu]
    end
  end

私が収集したものから、remote.request_ipはIPアドレスを提供しますが、request.remote_ipでその関数を呼び出すと、オブジェクトはnilになります。静的IPアドレスを入力すると、正しい出力が生成されます。remote.request_ip がそうしない場合、IP アドレスを取得する正しい方法は何でしょうか?

また、コンソールに「request.remote_ip」と入力しようとすると、「メインからの未定義のローカル変数またはメソッド「リクエスト」」が返されます

4

3 に答える 3

6

質問にタイプミスがありますか、それとも本当に remote.request_ip を呼び出していますか?

正しい方法はrequest.remote_ip

于 2012-11-21T16:26:43.873 に答える
3

これはモデルにあるはずのコードのように見えるので、このメソッドがある場所だと思います。その場合、HTTP リクエストから発信されているため、(少なくとも「すぐに」) モデルからリクエスト オブジェクトにアクセスできません。これが、メインから「未定義のローカル変数またはメソッド「リクエスト」を取得する理由でもあります。 "コンソールで。

このメソッドがまだモデルにない場合は、そこに配置し、コントローラーから呼び出して、引数として request.remote_ip を渡します。

def get_location_users(the_ip)
  if current_user
    return current_user.location_users
  else
    l = Location.find_by_ip(the_ip)
    lu = LocationUser.new({:location_id => l.id, :radius => Setting.get("default_radius").to_i})
    return [lu]
  end
end

次に、コントローラーで::

SomeModel.get_location_users(request.remote_ip)

また、一致するレコードがない場合、「Location.find_by_ip」は nil を返すことに注意してください。

また、 app.get "some-url"を使用してコンソールでリクエストを発行すると、リクエスト オブジェクトapp.request.remote_ipから request_ip にアクセスし、必要に応じてテストに使用できます。

于 2012-11-21T17:44:35.430 に答える
2
  • HTTPリクエスト:( request.ipセバスチャンが彼の答えで指摘したように)

    としても利用可能:request.env['action_dispatch.request_id']

  • HTTPS リクエスト: request.env['HTTP_X_FORWARDED_FOR'].split(/,/).try(:first)

于 2012-11-21T18:49:59.520 に答える