【问题标题】:How do I tell my Rails controller to use the format.json part of my method instead of the format.html branch?如何告诉我的 Rails 控制器使用我的方法的 format.json 部分而不是 format.html 分支?
【发布时间】:2018-07-08 17:26:08
【问题描述】:

我正在运行 Rails 并尝试在我的文本字段上设置自动完成功能。我想提交给控制器方法。如果我从表单提交(使用“提交”按钮),我想使用“format.html”分支。如果我使用自动完成 Ajax 调用提交,我想使用“format.json”分支...

  def search
    if params.has_key?("s")
      search = params[:s].strip
      @people = Person.where("name ilike ?", "%#{search.upcase}%")
      respond_to do |format|
        format.html {
          if @people.size == 1
            redirect_to controller: 'votes', action: 'show', id: @people.first.id
          end
        }
        format.json { @people.map(&:name) }
      end
    end
  end

我像这样在我的文本字段上设置了自动完成

$(function() {
  return $('#s').autocomplete({
    source: function(request, response) {
        $.get('/people/search', { s: request.term }, function(data) {
           alert(data)
           response(data.split('\n'));
        });
    }
  });
});

但是“数据”的值是一个 HTML 页面,就好像我通过 format.html 方法提交一样。如何配置,以便我的自动完成调用强制我从控制器呈现 JSON 响应?

【问题讨论】:

  • 在您的控制台中,您确定它是以 JSON 格式提交的吗?好像是JS。
  • 我将“format.json”行更改为“format.js”,但仍在调用“format.html”分支。
  • 你能添加你的控制台日志吗?以Started GET...开头的位你可能需要做:$.get('/people/search.js'...
  • 在我进行了一些其他更改之后才起作用......我不得不在我的控制器中添加“protect_from_forgery except: :search”。我觉得这可能很糟糕,但我会就此提出另一个问题。

标签: ruby-on-rails json jquery-ui autocomplete controller


【解决方案1】:

像这样在url中指定.json格式-

$.get('/people/search.json', { s: request.term }, function(data) {
   alert(data)
   response(data.split('\n'));
});

在控制器更改中发送原始 json 数据。否则它将寻找模板来构建 json(默认情况下,rails 会寻找 search.json.jbuilder)

format.json { render json: {people: @people.pluck(:name)} }

【讨论】:

  • 当我这样做时,请求导致错误,“PeopleController#search 缺少此请求格式和变体的模板”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-07
  • 2014-11-26
  • 2018-06-14
  • 2011-11-15
  • 1970-01-01
  • 2014-10-11
  • 1970-01-01
相关资源
最近更新 更多