【问题标题】:Render partial with refreshed data via AJAX通过 AJAX 使用刷新的数据渲染部分
【发布时间】:2014-02-28 03:34:42
【问题描述】:

我对 JS 很陌生,但我希望我错过了一些简单的东西。我正在尝试重新加载异步显示图像的部分。当用户点击下面的链接时,它会记录他们的投票,然后(它应该)使用数据库中的新图像渲染部分图钉。

index.html.erb(链接)

<%= link_to 'Less', {:controller => "pins", 
                     :action => "create_view", 
                     :rank => 0,
                     :user_id => current_user.id, 
                     :pin_id => @pins.id
                     },
                     :method => "post", :remote => true %>

pins_controller.rb(链接调用的方法)

def create_view
  @view = View.new
  @view.user_id = params[:user_id]
  @view.pin_id = params[:pin_id]
  @view.rank = params[:rank]

  if @view.save
   respond_to do |format|
    format.html { redirect_to root_path }
    format.js
   end
  else
   render action: "new"
  end
end

pins_controller.rb(生成@pins的方法)

def index
  seen = Array.new
  max_pins = 20
  sex = current_user.sex
  views = View.user_views(current_user)
  seen = views.map(&:pin_id)
  @pins = Pin.new_pin(seen, sex)

models/pins.rb

def self.new_pin(pin_ids, sex)
  b = TRUE
  self.find(:first, :conditions => ["sex = ? AND active = ? AND id not in (?)", sex, b,    pin_ids], :order => "created_at desc" )
end

index.html.erb(DIV 和部分)

<div id="main_well">
     <%= render @pins %>
</div>

create_views.js.erb(点击时触发的 javascript)

$('#main_well').html("<%= escape_javascript(render (partial: "pin", :locals => { pin: @pins})) %>");

_pin.html.erb(JS要重新加载的部分)

<div class="row">
 <div class="center_well">
   <div class="well" style="background-image: url('<%= pin.image %>')" onclick="window.open('<%= pin.product_url %>','mywindow');"></div>
 </div>
</div>

我已经有一段时间了。这就是我所知道的。单击该链接会远程更新数据库。如果我将 JS 更改为 $('#main_well').remove(),单击链接会异步删除图像。但是,在不刷新页面的情况下,我无法在点击时更新图像。提前感谢您的帮助。

编辑

在下面的答案中,实例变量 @pins 没有在 create_views 方法中领先。因此,重新生成实例变量链接 this 似乎可以解决问题。

pins_controller.rb

def create
 seen = Array.new
 max_pins = 20
 sex = current_user.sex
 views = View.user_views(current_user)
 seen = views.map(&:pin_id)
 @pins = Pin.new_pin(seen, sex)

 @view = View.new
 @view.user_id = params[:user_id]
 @view.pin_id = params[:pin_id]
 @view.rank = params[:rank]

 if @view.save
  respond_to do |format|
     format.html { redirect_to root_path }
     format.js
  end
 else
  render action: "new"
 end
end

但是,此解决方案仅用于成功重新加载部分。如果我单击链接,它会重新加载图像。但是,如果我再次单击该链接,则没有任何反应。但是,如果我像这样更改功能,它会完美运行:

pins_controller.rb

def create
 seen = Array.new
 max_pins = 20
 offset = rand(Pin.count)
 @pins = Pin.first(:offset => offset)

 @view = View.new
 @view.user_id = params[:user_id]
 @view.pin_id = params[:pin_id]
 @view.rank = params[:rank]

 if @view.save
  respond_to do |format|
     format.html { redirect_to root_path }
     format.js
  end
 else
  render action: "new"
 end
end

似乎在我第二次单击链接时没有重新加载局部变量“view”。我不知道为什么。任何帮助将不胜感激。

views.rb

def self.user_views(user)
  self.find(:all, :conditions => ['user_id = ?', user])
end

【问题讨论】:

    标签: javascript jquery ruby-on-rails ruby ajax


    【解决方案1】:

    更新

    参考 cmets,这很有效:

    def index
      seen = Array.new
      max_pins = 20
      sex = current_user.sex
      views = View.user_views(current_user)
      seen = views.map(&:pin_id)
      @pins = Pin.new_pin(seen, sex)
    end
    
    def create
      seen = Array.new
      max_pins = 20
      sex = current_user.sex
      views = View.user_views(current_user)
      seen = views.map(&:pin_id)
      @pins = Pin.new_pin(seen, sex)
    
      @view = View.new
      @view.user_id = params[:user_id]
      @view.pin_id = params[:pin_id]
      @view.rank = params[:rank]
    
      if @view.save
         respond_to do |format|
             format.html { redirect_to root_path }
             format.js
         end
      else
         render action: "new"
      end
    end
    

    原答案

    通过查看您的代码,它似乎应该工作,但我想有语法问题阻止它这样做


    @pins

    你在一个全新的动作中调用@pins

    问题是您的ajax 请求是一个新请求(您的实例在初始HTTP 请求结束后结束)。这意味着您的 @pins 实例变量不会通过 ajax 调用持续存在,这可能是您的局部变量无法正确呈现的原因

    试试:

    #app/controllers/pins_controller.rb
    def index
        @pins = Pin.new_pin(seen, sex)
    end
    
    def create
        @pins = Pin.find(params[:id])
    end
    

    部分

    当调用你的部分时,你可以试试这个:

    $('#main_well').html("<%=j render partial: "pin", :locals => { pin: @pins} %>");
    

    如果您的 @pins 变量被正确调用,这应该可以工作


    更新

    def self.user_views(user)
       where(user_id: user.id)
    end
    

    【讨论】:

    • 上面的代码还是不行。然而,它确实让我找到了答案。实际上,问题在于无法创建实例变量。当我将 Index 方法中的相关代码复制到 create 中时,它就像一个魅力。非常感谢你的帮助!我已经为此工作了好几天。
    • 没问题!如果有帮助,介意给我一个赞吗?如果你也想接受,我会修改答案
    • 这绝对有帮助。如果你修改答案我会给你支票,那么我应该有足够的声望给你一个赞成票。
    • 呃,我还有一个问题。异步重新加载,似乎只工作一次。我单击链接,它会重新加载图像。但是,如果我再次单击该链接,则没有任何反应。我将其追溯到这样一个事实:views = View.user_views(current_user) 在第二次单击时不会重新执行。如果我只是像这样拉一个随机引脚,它就可以正常工作:offset = rand(Pin.count) @pins = Pin.first(:offset =&gt; offset)
    • user_views 方法是什么?
    【解决方案2】:

    尝试改变这个:

    $('#main_well').html("<%= escape_javascript(render (partial: "pin", :locals => { pin: @pins})) %>");
    

    对此(将 html_safe 添加到 escape_javascript 调用的末尾):

    $('#main_well').html("<%= escape_javascript(render :partial => 'pin', :locals => { pin: @pins}).html_safe %>");
    

    编辑

    问题可能与部分渲染的方式有关。这行得通吗?

    $('#main_well').html("<%= escape_javascript("#{image_tag pin.image}").html_safe %>")
    

    【讨论】:

    • 那没有做到。结果相同。它会更新数据库,但不会在视图中呈现新图像。
    • 您是否检查了您希望发生更改的 HTML 以查看它是否只是未加载的图像或没有异步加载任何 HTML?
    • 似乎没有一个 HTML 是异步加载的。点击链接后完全一样。我试着把这个 '
      ' 并且对象没有更新。
    猜你喜欢
    • 2015-04-30
    • 1970-01-01
    • 2013-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多