jQuery向Rails发送post请求

16

我的设置: Rails 3.0.9, Ruby 1.9.2, jQuery 1.6.2

我有一个表单,显示了用户的多个照片和评论,我希望实现内联评论。

<div id="newsfeed">    
 <div> 
 <div class="photo_title">Summer 2011</div> 
 <div class="newsfeed_photo"> 
 <a href="..." /></a> 
 </div> 
 <textarea class="comment_box">Write a comment...</textarea>  
</div> 
<div> 
 <div class="comment_title">Seeing a movie</div> 
 <textarea class="comment_box">Write a comment...</textarea>  
</div> 

我想在用户按下文本输入框中的回车键时提交一个AJAX post请求。以下是我目前所拥有的不完整的javascript代码:

  $('#newsfeed').delegate('.comment_box', 'keydown', function (event){
    event.preventDefault();
    $.post('/sub_comments', ...);
  });

我正在使用delegate方法,因为<div id='newsfeed'>的内容可能会被另一个AJAX调用替换掉。我需要的是jQuery post方法的语法,假设我需要传递一些表单参数,比如说photo_id等等。假设我有一种方法来访问这些参数的值,那么以Rails期望的方式创建参数的post调用的语法是什么?

以下是标准的Rails代码片段:

sub_comments_controller.rb

  def new
    @sub_comment = SubComment.new

    respond_to do |format|
      format.html # new.html.erb
      format.js
    end
  end

此外我不想为每个内联评论都使用通常的<% = form_for(@sub_comment,:remote => true)do |f |%>。 我还看了Ryan Bates的railscast,但代码已过时。

1个回答

33

您可以设置您的文章以任何方式来构造数据,只要在 Rails 端正确解释即可,但最佳做法是使用一个包含所有值的 'model-name' 对象。

Javascript

$.ajax({
    url: "/sub_comments",
    type: "POST",
    data: {subcomment: {
             field: val, 
             field2: val, etc... }},
    success: function(resp){ }
});

Rails

def create
  @sub_comment = SubComment.new params['subcomment']
  if @sub_comment.save
    render :json => { } # send back any data if necessary
  else
    render :json => { }, :status => 500
  end
end

2
请问您为什么选择不使用respond_to块,能否解释一下原因?谢谢! - Mario Zigliotto
3
他这样做只是因为写起来比较短。结果是他不能在这个操作中渲染HTML,只能渲染JSON。 - DonPaulie
@DonPaulie 在 html.erb 视图中无法呈现 JSON,这不可能吗?我知道这个答案非常老了。我正在使用 Rails 6。 - developer01
@developer01,我不确定我是否理解了你的问题。如果你想要多种格式,一定要使用respond_to和块。如果你想在某种视图文件中构建json(而不是在控制器中),你可以简单地将文件命名为create.json.erb并编写内容。但是我建议你使用jbuilder gem或一些序列化模式。 - DonPaulie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接