在 chapter 12.2.5在 rails 教程中,引入 Ajax 是为了“在不离开页面的情况下向服务器异步发送请求”。 respond_to
然后在 Controller 中使用方法来允许启用了 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 %>
关系 Controller 中对应的 Action 是:
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 的原因是添加了
remote: true
在 form_for
辅助方法。根据教程, Controller 需要使用实例变量@user
而不是局部变量 user
用于表单 remote: true
.如果没有 Ajax,除了
remote: true
之外,结果形式将是相同的。代码缺失,在 Controller 中 respond_to
代码部分将被redirect_to 替换;此外,实例变量 @user
可以用局部变量user
代替,因此创建操作将是: def create
user = User.find(params[:followed_id])
current_user.follow(user)
redirect_to user
end
我想知道:为什么 Controller 必须使用
@user
实例变量而不是局部变量 user
为了使用Ajax?我尝试使用局部变量,实际上需要刷新才能看到任何更改。 @user
表单中的变量,用于@user.id
, 是在用户 Controller 的 show Action 中定义的,因为表单本身的部分被插入到 show.html.erb
中。文件。所以,据我所知,@user
之间没有联系。在用户 Controller 和 @user
中在关系 Controller 中。
最佳答案
您需要将其声明为实例变量 (@),以便在您的 View 中可用。是的,使用 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 %>');
关于ruby-on-rails - 为什么 Controller 需要实例变量来使用ajax,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35434920/