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