我该如何清理这个Padrino AJAX电话?

时间:2012-04-19 00:40:19

标签: jquery sinatra http-post padrino

我正在编写一个应用程序,主要是UI通过AJAX调用后端服务器。页面加载很少。

例如,当我创建一个旅行时,我的JS只是向Padrino发送一个JSON对象(通过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])

但这没效果。

这是我发送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操作中的冗余)并确保在保存之前对文本进行清理。

由于

1 个答案:

答案 0 :(得分:4)

首先,您应该使用attr_accessible和attr_protected aka 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