我在Rails上很不错,但在JavaScript和Ajax方面我完全迷失了。
我正在尝试这样做,以便当用户点击列表中的项目时,使用该项目上的Ajax调用update_attributes
。
这是我到目前为止所得到的,但它很糟糕,我完全迷失了。
在视图中:
<%= content_tag :div, class: "entry", data: {url: update_seen_count_url} do %>
<h5><a href="#"><%= simple_format user_notification.content %></h5>
<% end %>
update_seen_count
(在上面的数据属性中引用)引用此控制器操作:
class UserNotificationsController < ApplicationController
def update_seen_count
... (I think something like @usernotification.update_attributes but i have no idea)
end
end
有什么想法吗?
答案 0 :(得分:1)
我假设您希望用户点击特定链接。要使其工作,请使用link_to
帮助程序并添加remote
属性。例如:
<%= link_to simple_format(user_notification.content), update_seen_count_url, remote: true %>
然后,您可以使用控制器中的respond_to do |format|
定制响应,并添加action.js.erb
文件以通过javascript更改UI。
答案 1 :(得分:0)
首先定义Ajax调用的路由:
post "/my_controller/update_data" => "my_controller#update_data", :as => :update_data
然后在您的视图中,执行Ajax调用:
$.ajax({
type: "POST",
url: "<%= update_data_path %>",
dataType: "json",
data: { update_attr_name : update_attr_name, new_value : var}
})
.done(function(resp){
// when the controller responds
// you can "play" with the response for the controller
// for example if resp.my_status == "updated"
})
.fail(function(){
// when the response from the controller is not a JSON or a header error (4**, 5**)
})
.always(function(){
// run always
});
最后你的控制器:
def update_data
# you can retrieve here params[:update_attr_name] and params[:new_value]
# then you can working on it, this should work:
# mod = Model.update_attributes(params[:update_attr_name].to_sym => params[:new_value])
# if ok
respond_to do |format|
format.json {render json: {:my_status => "updated", :data => "my_data"}}
end
# if something goes wrong: fail the Ajax call
rescue Exception => e
puts "Exception #{e.message}"
render :nothing => true, :status => 500
end
我个人更喜欢这种方式,因为让开发人员在这个过程中更具“强大”和灵活性。