【发布时间】:2016-02-16 14:17:29
【问题描述】:
在 Rails 教程的chapter 12.2.5 中,引入了 Ajax 是为了“在不离开页面的情况下向服务器异步发送请求”。然后在控制器中使用respond_to 方法,以允许启用了 javascript 的浏览器使用 Ajax 或在 Ajax 被禁用时响应重定向。
用于在两个用户之间建立关系的表单是:
<%= form_for(current_user.active_relationships.build, remote: true) do |f| %>
<div><%= hidden_field_tag :followed_id, @user.id %></div>
<%= f.submit "Follow", class: "btn btn-primary" %>
<% end %>
关系控制器中对应的动作是:
def create
@user = User.find(params[:followed_id])
current_user.follow(@user)
respond_to do |format|
format.html { redirect_to @user }
format.js
end
end
Rails 有机会使用 Ajax 的原因是在 form_for 辅助方法中添加了 remote: true。根据教程,控制器必须使用实例变量@user,而不是局部变量user,才能在remote: true的形式中使用。
如果没有 Ajax,生成的表单将是相同的,除了缺少 remote: true 代码,并且在控制器中,respond_to 代码部分将替换为 redirect_to;此外,实例变量@user可以替换为局部变量user,这样创建动作就是:
def create
user = User.find(params[:followed_id])
current_user.follow(user)
redirect_to user
end
我想知道:为什么控制器必须使用@user 实例变量而不是局部变量user 才能使用Ajax?我尝试使用局部变量,实际上需要刷新才能看到任何更改。表单中的@user 变量(在@user.id 中使用)是在用户控制器的显示操作中定义的,因为表单本身的部分被插入到show.html.erb 文件中。因此,据我了解,用户控制器中的@user 和关系控制器中的@user 之间没有联系。
【问题讨论】:
-
为了记录,我想知道完全相同的事情......
标签: ruby-on-rails ajax railstutorial.org