在Rails中通过Ajax加载部分3

时间:2011-09-02 02:12:23

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

我在使页面更新时遇到问题。我完全迷失了,不知道从哪里开始。我的表单确实有一个:remote=>true页面初始加载,部分包含在一个名为comments的div标签中。当用户在表单上单击“提交”时,我不知道在控制器中放置什么或要创建什么文件,甚至不知道如何创建它来更新部分文件。谢谢你的帮助。

1 个答案:

答案 0 :(得分:4)

特拉维斯,

我不确定您要在此处执行哪项操作,因此我们假设您要create一个新资源。

我们假设您的资源名为Post

如果您使用rails生成PostController,则会在其中设置方法create

看起来像这样:

def create
  @posts= Post.new(params[:post])

  respond_to do |format|
    if @post.save
      format.html { redirect_to(@post, :notice => 'Post was successfully created.') }
      format.xml  { render :xml => @post, :status => :created, :location => @post}
    else
      format.html { render :action => "new" }
      format.xml  { render :xml => @post.errors, :status => :unprocessable_entity }
    end
  end
end

此处的关键部分是format.js块中需要respond_to

当您在表单或链接上放置:remote => true标志时,您告诉您要通过Ajax发出请求。这会导致在data-remoteform元素上放置a属性,而这又用于告诉不显眼的Javascript使用Ajax提交您的请求。

您需要确保的最终结果如下:

在您的控制器中,确保format.js块中列出了respond_to响应格式(请参阅上面的htmlxml示例。

其次,我们将在您的create.js.erb文件夹下创建一个app/views/posts文件。默认情况下,rails会查找与您的操作和格式相对应的action.format.erb文件。

app/views/posts/create.js.erb文件中,您现在可以放置响应javascript,以便相应地更新HTML文档。例如,如果您有一个帖子列表,并且您想要在其末尾添加新创建的帖子,则可能会出现以下情况:

app/views/something/show.html.erb

<h1>Posts</h1>
<div id="posts">
  <%= render @something.posts %>
</div>

<!-- here we will include the :remote => true option, which will add a data-remote attribute to our form -->
<%= form_for Post.new, :remote => true do |f| %>
  <%= f.text_area :text %>
  <%= f.submit %>
<% end %>

app/views/posts/create.js.erb

// here we're taking our newly created post and appending it to the list shown above
$('#posts').append("<%= escape_javascript(render @post) %>");

最后,让我们假设我们的帖子部分是这样的

app/views/posts/_post.html.erb

<p class="post-text"><%= @post.text %></p>

我不确定你正在使用什么javascript框架,但是我在这里使用jQuery。我相信如果您使用的是rails 3.1,则jQuery是使用的默认框架,否则您必须查看jquery_ujs

希望这有帮助。