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

时间:2013-03-08 13:56:06

标签: ruby-on-rails best-in-place

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

  • 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 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

谢谢!

3 个答案:

答案 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)

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

Answer here

但不是只插入你需要的值来使用你需要的总和。