2012-04-19 1 views
0

私は主にAJAX経由でバックエンドサーバーを呼び出すUIとなるアプリケーションを書いています。ページがほとんど読み込まれません。このPadrino AJAXコールをクリーンアップするにはどうすればよいですか?

たとえば、旅行を作成すると、JSはJSONオブジェクトをPadrinoに(POST経由で)送信し、PadrinoはTripオブジェクトを(ActiveRecord経由で)保存してJSON応答を返します。

これはうまくいくようですが、コードをクリーンアップするだけでなく、提出された値をサニタイズする必要があります。ここで

は私POSTコード(trips controller

post :index, :provides => :json do 
    response = {} 
    response[:trip] = {} 

    begin 
     @trip = Trip.new 
     @trip.title = params[:trip][:title] 
     @trip.description = params[:trip][:title] 

     if @trip.save 
      response[:status] = "Success" 
      response[:trip] = {:title => @trip.title, :description => @trip.description} 
      response[:message] = "#{@trip.title} successfully saved" 
     else 
      response[:status] = "Error" 
      response[:message] = "Error saving trip" 
     end 
    rescue 
    response[:status] = "Error" 
    response[:message] = "Error saving trip" 
    end 

    response.to_json 
end 

は現在、2つのフィールドのみ(タイトルと説明)がありますされているが行われたときに約4〜8が存在します。私は新しい旅行オブジェクトをどのように構築しているのか気に入らない。

私が使用してみました:

@trip = Trip.build(params[:trip]) 

が、それは動作しませんでした。

はここでPOSTを送信し、私のJSコードです:

// Save new trip 
$("#new_trip_save_btn").click(function() { 
    var self = this; 
    var new_trip = get_new_trip(); 

    $.ajax({ 
     data: {trip:new_trip}, 
     dataType: "json", 
     url: "/trips", 
     type: "post", 
     success: function(res) { 
      console.log(res) 
     } 
    }); 
}); 

...... 

var get_new_trip = function() { 
    var self = this; 
    var trip = {}; 
    trip.title = $("#new_trip_title").val(); 
    trip.description = $("#new_trip_description").val(); 
    trip.departure_date = $("#new_trip_departure").val(); 
    trip.return_date = $("#new_trip_return").val(); 

    return trip; 
} 

だから私は、コードをクリーンアップ(POSTアクションで冗長性を削除)して、テキストを保存する前に消毒されていることを確認するために何ができますか。

おかげ

答えて

4

すべての最初は、あなたがattr_accessible使用して大量の割り当てからモデルを保護し、別名mass assignment attr_protected必要があります。

次に、あなたのサイトはJavaScriptが有効になっていない状態でも動作できるように、「フォーム」を使用することを強くお勧めします。

unobtrusiveを使用すると、javascriptコードを使用することもできます。ここで

// Live watch events on form submit 
$(document).on('submit', 'form[data-remote]', function(e){ 
    e.preventDefault(); 
    self = $(this); 
    $.ajax({ 
    url: self.attr('action'), 
    data: self.serializeArray(), 
    type: self.attr('method'), 
    dataType: 'json', 
    success: function(res){ console.log(res) } 
    }) 
}); 

形式:ここでは、コントローラ

/* Here the form, for dates I suggest to use a calendar */ 
/* like https://github.com/arshaw/fullcalendar */ 
- form_for @trip, url(:trip, :index), :'data-remote' => true do |f| 
    == f.error_messages 
    == f.text_field :title 
    == f.text_area :description 
    == f.text_field :departure_date 
    == f.text_field :return_data 
    == f.submit 'Send' 

:あなたの応答のための

provides :json # if all your actions in your controller respond to #json it is more dry 

get :index do 
    @trip = Trip.new(params[:trip]) 

    if @trip.save 
    render :success => true, :attributes => @trip.to_json 
    else 
    render :success => false, :errors => @trip.errors.full_messages 
    end 
end 
+0

感謝。しかし、私の論理は、静的ページをnginxでレンダリングし、単にPadrinoをバックエンドとして使用することです。私はJSのUIに多くの時間を費やすので、JSはアクセスを意味しません。いくつかの人々は好きではない。しかし、来て...それは2012年です。笑。カスタムJS ajax投稿をBackboneに置き換えることについてのあなたの考えは? – cbmeeks

+0

に依存しますが、バックボーンは最適な選択ですが、アプリのロジックがあまり複雑でない場合は、最初から数行のjを書き込む方が良いでしょう。私のコード 'live'は、すべてのフォームを 'data-remote'属性で監視し、それをajaxリクエストに変換します。それは常に有用な「標準的な」rails-ujs/padrino-ujs呼び出しです。 – DAddYE

+0

バックボーンについては非常に真実です。私は実際には、nginxが提供する1つのHTMLページで、インデックス/新規/編集フォームをレンダリングしています。私はあなたがしようとしていることに基づいて各セクションを隠します。ページの読み込みが瞬時に表示されるようにします。 :-) – cbmeeks

関連する問題