Rails:使用JQuery代替post_to而不是link_to

时间:2015-04-29 07:53:27

标签: javascript jquery ruby-on-rails ajax

现在,我的Rails应用程序中有一个“投票”模型。页面上的每个帖子都有一个upvote按钮,目前写为:

<%= link_to "✓", votes_path(:vote => {:post_id => post.id, :up => false}), :method => :post %>

其中post_id是投票链接的帖子,而up是一个布尔表示投票是真的。我正在尝试使用JQuery而不是link_to,这样每次有人投票时页面都不会重新加载。但是,我不明白AJAX post请求与数据库模型的接口是什么样的。

编辑:投票控制器:

def create
    respond_to do |format|
        format.html
        format.js { flash[:notice] = "Vote created"} # and render your <action>.js file}
    end
    @vote = Vote.where(:post_id => params[:vote][:post_id], :user_id => current_user.id).first
    if @vote
        @vote.up = params[:vote][:up]
        @vote.save
    else
        @vote = current_user.votes.create(vote_params)
    end 
    redirect_to :back
end

2 个答案:

答案 0 :(得分:2)

使用remote: true选项进行ajax调用。

<%= link_to "✓", votes_path(:vote => {:post_id => post.id, :up => false}, :format => :js), :method => :post, remote: true %>

它将为您的控制器生成一个ajax调用。然后,您可以相应地操纵您的操作。

respond_to do |format|
 format.html
 format.js { flash[:notice] = "Vote created"} # and render your <action>.js file
end

<强>更新

def create
    @vote = Vote.where(:post_id => params[:vote][:post_id], :user_id => current_user.id).first
    if @vote
        @vote.up = params[:vote][:up]
        @vote.save
    else
        @vote = current_user.votes.create(vote_params)
    end 
    respond_to do |format|
        format.html
        format.js { flash[:notice] = "Vote created"} # and render your <action>.js file}
    end
end

应该有用,让我知道

还要检查一下..

您的app/assets/javascripts/application.js应该包含。

//= require jquery 
//= require jquery_ujs

你的erb应该包含

<%= javascript_include_tag "jquery", "jquery_ujs" %>

答案 1 :(得分:-1)

您可以重新使用link_topost远程请求,而无需加载:

<%= link_to "✓", votes_path(:vote => {:post_id => post.id, :up => false}), :method => :post, remote: true %>. 

你必须为此目的写一个<your_action_name>.js.erb