javascript - 通过 AJAX 渲染部分刷新数据

标签 javascript jquery ruby-on-rails ruby ajax

我是 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(),单击链接会异步删除图像。但是,我无法在不刷新页面的情况下获取图像来更新 onclick。预先感谢您的帮助。

编辑

如以下答案所示,实例变量@pins 未在 create_views 方法中领先。因此,重新生成实例变量链接似乎可以解决问题。

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

最佳答案

更新

引用评论,这有效:

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

你在一个全新的 Action 中调用@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

关于javascript - 通过 AJAX 渲染部分刷新数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22085656/

相关文章:

javascript - jQuery 使整个 Div 成为带有 _blank 的可点击链接

javascript - 如何在数据库更新时向客户端发送警报,例如 Facebook 聊天

jquery - 使用 JQuery 和 CSS 的选项卡式布局

javascript - 没有刷新的 Rails 提交表单,:remote => true

ruby-on-rails - 使用curl使用摘要测试基本的HTTP身份验证

javascript - KnockoutJs beta 3.0 - 如何销毁子元素?

javascript - 如何在 Javascript 中生成文本文件并下载 zip 文件?

javascript - react 具有不同授权的多页面应用程序

jquery - 用特定颜色填充单元格日期选择器的一半

html - 将高度添加到 Rails 搜索字段标签