3

都市が含まれているアプリがあります。AJAXリクエストを介して都市レコードを検索、初期化、作成できるように、コントローラーをRESTfulに構造化する方法に関するいくつかの提案を探しています。例えば:

  • 与えられたテキストフィールドcity_name
  • ユーザーが「パリ、フランス」のように都市の名前を入力します
  • アプリはこの場所をチェックして、データベースにそのような都市がすでに存在するかどうかを確認します
  • 存在する場合は、都市オブジェクトを返します
  • 存在しない場合は、「パリ」という名前と「フランス」の国で初期化された新しいレコードが返され、この都市をデータベースに追加することを確認するようにユーザーに求められます。
  • ユーザーが「はい」と言うと、レコードが保存されます。そうでない場合、レコードは破棄され、フォームはクリアされます。

さて、私の最初のアプローチは、Createアクションを使用するように変更することでしたfind_or_create。これにより、AJAX投稿cities_pathは、既存の都市を返すか、作成して返すことになります。

それは問題なく動作します...ただし、文字列入力、検索、または初期化して返すコントローラーアクションを設定し、生成されたレコードが正しいことをユーザーが確認した場合にのみ作成することをお勧めします。理想的なシナリオでは、これをすべて1つのアクションにまとめて、AJAXリクエストがそのURLに移動し、サーバーがJSONオブジェクトで応答し、javascriptがそこから処理できるようにします。すべてのユーザーインタラクションロジッククライアント側を維持し、これを実現するために必要なリクエストの数を最小限に抑えたいと思います。

これを達成するための最もクリーンで最もRESTfulな方法に関する提案はありますか?

4

1 に答える 1

0

1 つのオプションは、exists を利用することですか? 方法:

if City.exists?(:name=>params[:city])
  @city = City.find_by_name(params[:city])
else
  @city = City.new(:name=>params[:city])
end

コメントに基づく更新:

#show = /city/:id, :id can be int or string

def show
  if params[:id].to_i > 0
    @city = City.find(params[:id])
  elsif City.exists?(:name=>params[:id])
    @city = City.find_by_name(params[:id])
  else
    return redirect_to(:action=>:new, :name=>params[:id])
  end
end

def new
  @city = City.new(params[:name])
end
于 2012-04-15T23:33:47.673 に答える