我正在编写一个应用程序,主要是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操作中的冗余)并确保在保存之前对文本进行清理。
由于
答案 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