2012-04-19 3 views
0

Я пишу приложение, которое будет главным образом пользовательским интерфейсом, вызывающим бэкэнд-сервер через AJAX. Очень мало загрузок страниц.Как я могу очистить этот вызов AJAX от Padrino?

Так, например, когда я создаю поездку, мой JS просто отправляет объект JSON в Padrino (через POST), а Padrino сохраняет объект поездки (через 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 

В настоящее время существует только два поля (название и описание), но будет около 4-8, когда сделано. Мне не нравится, как я строю новый объект поездки.

Я попытался с помощью:

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

, но это не сработало.

Вот мой JS код, который отправляет POST:

// 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 и attr_protected ака mass assignment.

Затем я настоятельно рекомендую использовать «формы», чтобы ваш сайт мог работать без включенного javascript.

Таким образом, используя код unobtrusive, код javascripts также может быть приятнее.

// 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

Depends, Backbone - отличный выбор, но если логика приложения не такая сложная, лучше писать с нуля несколько строк js. Мой код «вживую» просматривает все ваши формы с атрибутами «data-remote» и преобразует их в запрос ajax. Это стандартный вызов rails-ujs/padrino-ujs, который всегда полезен. – DAddYE

+0

Очень верно о Магистраль. Я на самом деле создаю форму index/new/edit на одной странице HTML, которую будет обслуживать nginx. Затем я скрою каждый раздел на основе того, что вы пытаетесь сделать. Кажется, что загрузка страницы мгновенная. :-) – cbmeeks

Смежные вопросы