如何进行Ajax update_attributes?

时间:2013-12-13 19:44:05

标签: javascript jquery ruby-on-rails ruby ajax

我在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

有什么想法吗?

2 个答案:

答案 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 

我个人更喜欢这种方式,因为让开发人员在这个过程中更具“强大”和灵活性。