0

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

例如,当我创建行程时,我的 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])

但这没有用。

这是我发送 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

1 回答 1

4

首先,您应该使用 attr_accessible 和 attr_protected aka mass assignment保护您的模型免受大规模分配。

然后我强烈建议使用“表单”,这样您的网站就可以在没有启用 javascript 的情况下运行。

所以使用不显眼的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
于 2012-04-19T09:12:24.733 回答