gpt4 book ai didi

ruby-on-rails - 为什么 Controller 需要实例变量来使用ajax

转载 作者:行者123 更新时间:2023-12-04 03:44:39 26 4
gpt4 key购买 nike

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: trueform_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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com