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

标签 ruby-on-rails ajax railstutorial.org

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/

相关文章:

ruby-on-rails - Rspec测试加载错误: cannot load such file -- spec_helper (LoadError)

ruby-on-rails - 通过 ActiveResource 向 Web 服务提供凭据

javascript - Rails 5,Gmaps4Rails-设置

php - 从服务器向客户端发送数据?

php - 来自对 PHP 的 AJAX 调用的奇怪的 JavaScript 语法错误

testing - 由于密码测试,rails 测试电子邮件验证错误?

ruby-on-rails - RSpec:如何创建辅助 stub 方法?

javascript - django cms 插件上的动态模型选择字段

ruby-on-rails - Rails应用程序中未初始化的常量 capybara (NameError)

ruby-on-rails - 为 Heroku 安装 PostgreSQL gem pq