best_in_place - 在视图中使用更新的值

Posted

技术标签:

【中文标题】best_in_place - 在视图中使用更新的值【英文标题】:best_in_place - use updated value back in view 【发布时间】:2013-02-24 02:10:20 【问题描述】:

我有一个想法和一个问题,但我似乎找不到答案或解决方案。 稍后需要或有帮助的一些信息:

Rails 版本 3.2.9 best_in_place (git://github.com/straydogstudio/best_in_place.git) Ruby 1.9.3p327

好的,所以我有设置页面,我可以通过使用 best_in_place gem 编辑单个设置来更新它们。工作正常。对此感到高兴。

有些设置是相互关联的,也就是说,我必须将它们相加或相减。 作为对用户有用的提示,在我看来,在该设置的就地表单旁边还有一个计算值。

现在,当然,我希望看到此值与属性本身一起更新。 我找不到这样做的方法。

如果我使用 :data => 这样做,它可以工作,但我得到的是旧值而不是新值,所以我的观点总是“落后一步”。

我也尝试过 update.js.erb 和 _test.html.erb 部分,但 javascript 文件不起作用。就好像它不存在一样。我已经检查了两次,三次检查放置它的位置,它没问题(app/views/controller/_partial.html.erb)

所以。非常简单的问题是;我如何访问更新的值并将其用于更新计算。我个人认为我应该使用部分和 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 => "model" => @model,因为它必须与 format.json respond_with_bip(@s) 结合使用。

我应该把渲染放在控制器的哪里? 目前,我收到 500 个内部服务器错误作为响应。

我找到了这个解决方案here。

谢谢!!

【问题讨论】:

您应该显示您的代码(html/js 和控制器)。没有它,我们只能做出假设。也许你的 JS 代码有错误,让你认为你的文件没有被拾取。 好的,我已经添加了相关代码。谢谢 【参考方案1】:

我刚刚回答了这样一个问题:

Answer here

但不是只插入您需要的值,而是使用您需要的总和。

【讨论】:

这不起作用,原因与您对另一个问题的回答不起作用【参考方案2】:

您可以使用 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 请求的小部件。我对所有这一切的唯一担心是您的成功处理程序以某种方式击败了最佳处理程序,并且您在更新之前获得了小部件。在我的测试中,这从未发生过。

【讨论】:

【参考方案3】:

在 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)) %>");

【讨论】:

以上是关于best_in_place - 在视图中使用更新的值的主要内容,如果未能解决你的问题,请参考以下文章

best_in_place 更新后保留原始值

具有嵌套属性的 Best_In_Place 内联编辑

Best_in_place 标签槽

Rails best_in_place gem 不更新数据

Rails 4 - best_in_place gem 和多对多关联

在 AJAX 请求期间使用 js 禁用所有 best_in_place 字段