ruby-on-rails – 为什么控制器需要实例变量才能使用ajax
发布时间:2020-12-17 02:56:12 所属栏目:百科 来源:网络整理
导读:在 chapter 12.2.5的rails教程中,引入了Ajax以“在不离开页面的情况下异步发送请求到服务器”.然后在控制器中使用respond_to方法,以允许具有启用的javascript的浏览器使用Ajax,或者在禁用Ajax的情况下使用重定向进行响应. 用于在两个用户之间创建关系的表单
在
chapter 12.2.5的rails教程中,引入了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,除了远程:真正的代码缺失之外,结果形式将是相同的,并且在控制器中,代码的respond_to部分将被redirect_to替换;此外,实例变量@user可以由局部变量user替换,因此create action将是: def create user = User.find(params[:followed_id]) current_user.follow(user) redirect_to user end 我想知道:为什么控制器必须使用@user实例变量而不是局部变量用户才能使用Ajax?我尝试使用局部变量,实际上需要刷新才能看到任何变化.表单中的@user变量(在@ user.id中使用)在用户控制器的show动作中定义,因为表单本身的部分插入show.html.erb文件中.因此,据我所知,用户控制器中的@user与关系控制器中的@user之间没有任何关联. 解决方法
您需要将其声明为实例变量(@),以便它在您的视图中可用.是的,使用ajax你没有重新加载页面,但你发回js而不是html. rails将响应create.js.erb中的任何内容.请注意,在此文件中,您需要访问@user数据;如果您将其声明为用户而不是@user,则无法访问它:
#app/views/relationships/create.js.erb $("#follow_form").html("<%= escape_javascript(render('users/unfollow')) %>"); $("#followers").html('<%= @user.followers.count %>'); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |