2012-04-15 8 views
3

私はCitiesを持つアプリを持っています。私は、AJAXリクエストを介して都市レコードを検索、初期化、および作成できるように、RESTfulにコントローラを構築する方法に関するいくつかの提案を探しています。例えば:Rails:RESTful検索、初期化、作成

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

、私の最初のアプローチは、cities_pathにAJAXポストは、既存の都市を返すか、それを作成し、それを返すのいずれかにつながるように、find_or_createを使用するために作成します。アクションを変更することでした。

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

これを達成する最もクリーンで最もRESTfulな方法についてのご意見はありますか?

+0

明確にする:私はfind_or_initialize_by_' 'の存在を知ってる、私は上の提案を探していますと、コントローラのアクションが使用するものですできるだけ清潔で安らかなものにするためにどのような行動をとるべきか。ありがとう! – Andrew

答えて

0

1つのオプションは存在を利用することでしょうか?方法:コメントに基づいて

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 
+0

確かに、これは 'create'や' show'アクションでですか?あなたは、一つのアクションを使って検索や初期化を行い、もう一つのアクションを作成のために使うか、すべての動作を一つのアクションにまとめますか、それは本当に私が得ているものです。観察してくれてありがとう! – Andrew

+0

いずれかのロジックを使用することもできます。私が提供したコードは、インスタンスを取得したり、新しいインスタンスを初期化したりするだけです。 –

+0

あなたがajaxでどのような行動をとるべきかを聞いているなら、ショーを使ってリダイレクトして、それが存在しなければリダイレクトしてくれるでしょう。 –

関連する問題