我在使页面更新时遇到问题。我完全迷失了,不知道从哪里开始。我的表单确实有一个:remote=>true
页面初始加载,部分包含在一个名为comments的div标签中。当用户在表单上单击“提交”时,我不知道在控制器中放置什么或要创建什么文件,甚至不知道如何创建它来更新部分文件。谢谢你的帮助。
答案 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-remote
或form
元素上放置a
属性,而这又用于告诉不显眼的Javascript使用Ajax提交您的请求。
您需要确保的最终结果如下:
在您的控制器中,确保format.js
块中列出了respond_to
响应格式(请参阅上面的html
和xml
示例。
其次,我们将在您的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。
希望这有帮助。