将局部变量传递给局部变量

时间:2016-03-10 00:53:00

标签: jquery ruby-on-rails ajax

我正在展示一个带有表格的帖子集合,以及#39;喜欢'每个人都有一个帖子。我也在帖子页面中使用相同的操作。

我的代码适用于format.html但是使用Ajax我收到了一个错误:

  

NameError(未定义的局部变量或方法`micropost' .... microposts / _like_grid.html.erb:2

我认为它的工作原理是纯HTML,因为我在重定向到原始页面时得到了params。

我读过许多S.O.回答但我仍然对如何将变量传递给partials感到困惑。在一个帖子页面我很容易理解,因为从一个单一的对象:params但是当我需要在一个集合中做它时我感到困惑。迭代如何对每个部分渲染进行处理。

class LikesController < ApplicationController
  before_action :logged_in_user

  def create
    @micropost = Micropost.find(params[:micropost_id])
    current_user.like!(@micropost, current_user)
    respond_to do |format|
      format.html {redirect_to :back }
      format.js
    end
  end

  ...

用户/ show.html.erb:

<%= render @microposts %>
<%= will_paginate @microposts %>

视图:_micropost.html.erb

      <div id="like_form">
      <% if current_user.liking?(micropost) %>
        <%= render partial: 'microposts/unlike_grid', locals: { micropost: micropost } %>
      <% else %>
        <%= render partial: 'microposts/like_grid', locals: { micropost: micropost } %>
      <% end %> 
      </div>

_like_grid.html.erb:

<%= form_for(current_user.likes.build, remote: true) do |f| %>
  <div><%= hidden_field_tag :micropost_id, micropost.id %></div>
  <%= f.submit "Like" %>
<% end %>

像/ create.js.erb:

$("#like_form").html("<%= escape_javascript(render('microposts/unlike_grid')) %>");

2 个答案:

答案 0 :(得分:0)

micropost

中渲染时,您错过了like/create.js.erb

要修复它,请在渲染部分时传递micropost

$("#like_form").html("<%= escape_javascript(render('microposts/unlike_grid', locals: {micropost: @your_micropost})) %>");

顺便说一句,您可能先在控制器中找到@your_micropost

答案 1 :(得分:0)

您已在@microsoft中设置实例变量action。你只需要将它传递给你所需要的部分。在不使用locals:密钥变量时,您不需要提供partial:密钥变量。

 $("#like_form").html("<%= escape_javascript(render('microposts/unlike_grid', micropost: @micropost)) %>");