我对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)

型号/引脚.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和partial)
<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方法的前导。因此,重新生成实例变量链接似乎解决了这个问题。
插脚控制器.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

但是,此解决方案只能成功地重新加载一次部分。如果我单击链接,它将重新加载图像。但是,如果我再次单击链接,什么也不会发生。但是,如果我像这样更改函数,它就会工作得很好:
插脚控制器.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”在我第二次单击链接时没有被重新加载我不知道为什么。任何帮助都将不胜感激。
视图.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请求是一个新请求(您的实例在初始HTTP请求结束后结束)这意味着您的ajax实例变量没有通过ajax调用持久化,这可能是您的partial无法正确呈现的原因。
尝试:
#app/controllers/pins_controller.rb
def index
    @pins = Pin.new_pin(seen, sex)
end

def create
    @pins = Pin.find(params[:id])
end

部分
当您调用partial时,您可以尝试以下操作:
$('#main_well').html("<%=j render partial: "pin", :locals => { pin: @pins} %>");

如果您的@pins变量被正确调用,这应该可以工作
更新
def self.user_views(user)
   where(user_id: user.id)
end

10-05 20:39