【问题标题】:how to get the Ajax value in a Rails Controller如何在 Rails 控制器中获取 Ajax 值
【发布时间】:2014-02-18 18:48:49
【问题描述】:

我设法使用 Ajax 调用发送了一个字符串(测试)值,但我无法使用我的控制器(闪光通知或其他)在我的视图中真正显示它:

使用 JQuery 的 Ajax 调用

 $(document).ready(function() {

        $("#completed").live('click', function() {
        alert (document.getElementById('query').value); 
});

$.ajax

({ 
    url: '.',
    data: {
    chosenformat : "myvalue",
    },
    type: 'post',
    success: function()
    {
        alert ('success'); 
    }
    }); 
});

我想在我的控制器中获取 'chosenformat' 值:

format = params[:chosenformat]
flash[:format] = "chosen format: " + params[:chosenformat].to_s()

if !(format.nil?)
      respond_to do |format|
      format.html # contact.html.erb
      format.json {
        render :response => {:format => format}
      }
     end 
end

问题是我确实收到了“成功”消息,所以显然没有路由问题,但我看不到视图中显示的变量:

<%- flash.each do |key, msg| -%>
  <div id="<%= key %>">
  <p>flash <%= msg %></p>
  <%- end -%>

非常感谢您的帮助:)

【问题讨论】:

  • 你为什么要发送chosenFormat,然后又不加改动地把它拿回来?
  • 如果您想查看控制器返回的值,您应该更改您的“成功”函数以使用新值更新您的 HTML。您正在返回一个 JSON 对象,它不会修改 html 文档本身
  • 我基本上想将该值传递给我的控制器。然后,在该控制器中,我可以重新做一些工作(通过运行外部脚本来编写文件,...)我想发送给控制器的值最终将是一个文本字段,其中包含多个下拉选择的串联.如果您认为我太过分了(因此使事情复杂化......),我很乐意给我发送 Skype

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


【解决方案1】:

我认为错误在于您发送的数据形式,因为就像您没有设置您发送的消息正文的类型(contentType)一样,他采用标准只是更改您的代码

data: "chosenformat=" + "myvalue",

或者将消息体的类型改为默认为:

 contentType : 'application/x-www-form-urlencoded; charset=UTF-8'

【讨论】:

  • data: "chosenformat=" + "myvalue" 在服务器上给我错误 500 和 contentType : 'application/x-www-form-urlencoded; charset=UTF-8' 没有任何区别。不过感谢您的建议:)我倾向于认为:-要么它必须在发送之前正确格式化(例如xml)-要么我不处理控制器端的响应,因为我应该
【解决方案2】:

如果您收到任何 JSON 响应,则表示问题出在控制器中的操作上。

我看到的问题是:

你分配:format = params[:chosenformat] 没关系,

然后你设置flash[:format] = "chosen format: " + params[:chosenformat].to_s()也可以,

然后你检查格式变量是否存在:if !(format.nil?)

但是!稍后您在 respond_to 块内再次使用 format 变量。但是这个变量改变了它的内容。在街区内,您不再拥有params[:chosenformat]! 而不是这个,你有当前的请求数据。

为了解决问题更改变量的名称。 让我稍微重构一下你的代码:

chosen_format = params[:chosenformat]
flash[:format] = "chosen format: #{chosen_format}"

if chosen_format.present?
  respond_to do |format|
    format.html
    format.json {
      render json: { format: chosen_format }
    }
  end 
end

您现在将在 json 响应中获得您的格式,如果您呈现 html,它将在 flash 变量中

【讨论】:

  • 感谢 palinium 的有用评论 :) 它仍然不起作用.. 快速问题:我是否必须重新加载页面才能显示我的值?这么说是因为在这里我通过单击我的按钮来调用 Ajax:&lt;td&gt; &lt;%= button_tag 'Call AJAX' , :class =&gt; "button_to" , :id =&gt; "completed" , :remote =&gt; true %&gt; &lt;/td&gt; 并且通过 url 是:`url:'.'`(请参阅上面的完整 ajax 设置)所以也许它必须重新加载页面才能显示它.欢呼
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-17
  • 1970-01-01
  • 2018-08-30
  • 1970-01-01
  • 2014-03-05
相关资源
最近更新 更多