我有一个想法和一个问题,我似乎无法找到答案或解决方案。 如果以后需要或有帮助的一些信息:
好的,所以我有设置页面,我可以通过使用best_in_place gem编辑它们来更新个别设置。工作良好。很高兴。
某些设置是互连的,这意味着,我必须将它们相加或相减。 作为用户的有用提示,在我看来,在该设置的就位表单旁边还有一个计算值。
现在,当然,我希望看到这个值与属性本身一起更新。 我找不到办法做到这一点。
如果我使用:data =>它有效,但我得到旧的而不是新的价值,所以我的观点总是“落后一步”。
我也尝试过update.js.erb和_test.html.erb partial,但是javascript文件不起作用。它就像它不存在。我有双重,三重检查放在哪里,它没关系(app / views / controller / _partial.html.erb)
因此。非常直截了当的问题是;我如何访问更新的值并将其用于更新计算。我个人认为我应该使用partial和js文件 - 但我不知道为什么JS文件没有被选中。有什么想法吗?
如果还有其他选择,我会非常感谢提示。
谢谢!
- 编辑(已添加代码)
视图:
<td>
<%= best_in_place @s,:pay_after_bonus, :display_with => :number_to_percentage, :type => :input, :nil => "Klikni tu za spremembo!", :cancel_button=> "Prekliči" %>
Cena: <span id="test"><%= number_to_currency(@s.family_member_price - ((@s.pay_after_bonus * @s.family_member_price)/100)) %></span>
</td>
settings_controller.rb:
def update
@s = Setting.find(params[:id])
respond_to do |format|
@s.update_attributes params[:setting]
@s.create_activity :update, :params => { :setting => params[:setting].keys.first }, owner: current_user
format.json { respond_with_bip(@s) }
format.js
end
end
update.js.erb:
$( "#test" ).html( "<%= escape_javascript( render( :partial => "update") ) %>" );
_update.html.erb:
<strong>Test</strong>
- 编辑2:
好的,显然我可以做这样的事情:
$('.best_in_place[data-attribute="model_attribute"]').bind(
"ajax:success", function(event, data) {
// function that will update whatever
});
与
结合使用// respond to json request with
render :json => {"model" => @model}
&安培;
"ajax:success", function(event, data) {
var result = $.parseJSON(data);
// from here the result var will be accessible with all the data returned by the controller.
// result.model is your object - use result.model.attribute to get specific values...
}
但这里结束了我。 我不知道如何使用render:json =&gt; {“model”=&gt; @model}在我的情况下,因为它必须与format.json {respond_with_bip(@s)}一起完成。
我将渲染放在控制器中的哪个位置? 目前,我尝试将500个内部服务器错误作为响应。
我找到了这个解决方案here。
谢谢!
答案 0 :(得分:1)
在ajax回调中,你可以提出另一个请求来获得你想要的部分:
$('.best_in_place.myclass').bind("ajax:success", function () {
$.getScript("http://www.someurl.com");
});
然后在动作中渲染一个JS文件(例如:show.js.erb),在那里用渲染的结果替换目标元素:
$("#div-<%= @div.id %>").replaceWith("<%= escape_javascript(render(partial: 'some/partial', :layout => false)) %>");
答案 1 :(得分:0)
您可以使用jQuery解析最刚刚更改的元素的dom,并从那里获取更新的值。例如,你有这个代码(haml)
= best_in_place @user, :name, :classes => 'name-edit'
然后你的回调看起来像这样(coffeescript)
$('.name-edit').on 'ajax:success', (event, data, status, xhr) ->
newValue = $('.name-edit').html # could also use .attr() here
$('.some-other-widget').html(newValue) # again could also set .attr here
您甚至可以跳过使用jQuery查找新值。在回调处理程序的上下文中,'this'表示调用的元素,所以你可以这样做
$('.name-edit').on 'ajax:success', (event, data, status, xhr) ->
$('.some-other-widget').html this.innerHTML
以这种方式获取其他窗口小部件的新值。我的猜测是ajax处理程序返回的事件也有currentTarget,它也是触发ajax请求的小部件。我唯一担心的是,你的成功处理程序会以某种方式击败最佳位置处理程序,并在更新之前获取小部件。在我从未发生的测试中。
答案 2 :(得分:-1)