为什么控制器需要实例变量才能使用ajax
Why controllers need instance variables to use ajax
在rails教程的chapter 12.2.5中,为了"send requests asynchronously to the server without leaving the page"引入了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
。根据教程,controller需要使用实例变量@user
代替局部变量user
,用于withremote: 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.id
中使用的表单中的 @user
变量是在用户控制器的显示操作中定义的,因为表单本身的部分已插入到 show.html.erb
文件中。因此,据我了解,用户控制器中的 @user
与关系控制器中的 @user
之间没有任何联系。
您需要将其声明为实例变量 (@),以便在您的视图中可用。是的,使用 ajax 并没有重新加载页面,而是发回 js 而不是 html。 rails 将使用 create.js.erb
中的任何内容进行响应。请注意,在此文件中,您需要访问@user 数据;如果您将其声明为 user
而不是 @user
,它将无法访问:
#app/views/relationships/create.js.erb
$("#follow_form").html("<%= escape_javascript(render('users/unfollow')) %>");
$("#followers").html('<%= @user.followers.count %>');
在rails教程的chapter 12.2.5中,为了"send requests asynchronously to the server without leaving the page"引入了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
。根据教程,controller需要使用实例变量@user
代替局部变量user
,用于withremote: 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.id
中使用的表单中的 @user
变量是在用户控制器的显示操作中定义的,因为表单本身的部分已插入到 show.html.erb
文件中。因此,据我了解,用户控制器中的 @user
与关系控制器中的 @user
之间没有任何联系。
您需要将其声明为实例变量 (@),以便在您的视图中可用。是的,使用 ajax 并没有重新加载页面,而是发回 js 而不是 html。 rails 将使用 create.js.erb
中的任何内容进行响应。请注意,在此文件中,您需要访问@user 数据;如果您将其声明为 user
而不是 @user
,它将无法访问:
#app/views/relationships/create.js.erb
$("#follow_form").html("<%= escape_javascript(render('users/unfollow')) %>");
$("#followers").html('<%= @user.followers.count %>');