【问题标题】:Why controllers need instance variables to use ajax为什么控制器需要实例变量来使用 ajax
【发布时间】: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


【解决方案1】:

您需要将其声明为实例变量 (@),以便它在您的视图中可用。是的,使用 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 %>');

【讨论】:

  • 谢谢。现在更有意义了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-24
  • 2014-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-23
相关资源
最近更新 更多