【问题标题】:Rails: return only jsonRails:仅返回 json
【发布时间】:2015-01-17 00:14:38
【问题描述】:

在我的应用程序中有一个您可以投票的项目列表。我想通过 AJAX 调用来投票。

这是视图:

<ul class="list-groups">
<% @questions.each do |question| %>
    <li class="list-group-item">
    <%= link_to question.description, question_path(question) %>
    <%= form_for(question, :url => url_for(:controller => 'vote', :action => 'vote'), method: :post, html: { class: 'form-inline' }) do |f| %>
      <%= f.submit 'Up vote', class: "btn btn-default" %>
      <%= f.hidden_field :id, :value => question.id %>
    <% end %>
  </li>
<% end %>
</ul>

这是实现它的方法:

class VoteController < ApplicationController
respond_to :json

    def vote
        question_id = params[:question][:id]
        user_id = current_user.id
        vote = Vote.where(["question_id = :q", { q: question_id }]).where(["user_id = :u", { u: user_id }])
        respond_to do |format|
            if vote.nil?
                @vote = Vote.new
                @vote.question_id = question_id
                @vote.user_id = user_id
                @vote.save
                format.html { render '/home/index' }
                format.json { render :json => { :status => 'ok' } }
            else
                format.html { render '/home/index' }
                format.json { render :json => { :status => 'failed', :msg => 'You already voted' } }
            end
        end
    end
end

如果我不包含此 format.html { render '/home/index' } 我会收到此错误:

ActionController::UnknownFormat in VoteController#vote

但我不想再次渲染页面,我只是加载在使用 jQuery 和 ajax 操作后会更改的 html 片段。

我怎样才能只用 json 响应?

【问题讨论】:

标签: ruby-on-rails ajax json ruby-on-rails-4


【解决方案1】:

在您的控制器操作中使用 respond_with 而不是 respond_to。

respond_with do |format|

控制器顶部的respond_to 旨在与控制器操作中的respond_with 一起使用,而控制器操作中的respond_to 会忽略您在控制器顶部定义的respond_to

如果您希望您的请求通过 AJAX,请确保您正在进行远程呼叫,而不是正常呼叫。

<%= form_for(question, :url => url_for(:controller => 'vote', :action => 'vote'), method: :post, remote: true, html: { class: 'form-inline' }) do |f| %>

注意 remote: true 部分作为参数添加到 form_for 帮助器。

【讨论】:

    【解决方案2】:

    您需要在form_for 中包含remote: true 才能使调用请求AJAX 而不是HTML。

    <%= form_for(question, :url => url_for(:controller => 'vote', :action => 'vote'), remote: true, method: :post, html: { class: 'form-inline' }) do |f| %> 
    

    查看Working with JavaScript in Rails 文档了解更多信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多