2013-03-08 6 views
9

私にはアイデアと問題があります。答えや解決策が見つからないようです。 後で必要または有用場合、一部の情報:best_in_place - 更新された値をビューに戻す

  • Railsのバージョン3.2.9
  • best_in_place(gitの://github.com/straydogstudio/best_in_place.git)
  • ルビー1.9.3p327

私はbest_in_place gemを使用して個々の設定を編集して設定を更新できる設定ページを用意しています。正常に動作します。それに満足です。

いくつかの設定は相互接続されています。つまり、それらを合計または減算する必要があります。 ユーザーにとって参考になるヒントとして、私の見解では、その設定のインプレースフォームの横に、計算された値があります。

もちろん、この値が属性自体とともに更新されていることを確認したいと思います。 私はそれを行う方法を見つけることができません。

私は:data =>それを使っても、新しい値ではなく古い値を取得するので、私の見解は常に「1ステップ遅れ」です。

私もupdate.js.erbと_test.html.erb partialで試してみましたが、javascriptファイルは動作しません。それは存在しないのと同じです。私はそれを置く場所をダブル、トリプルチェックしてOKです(app/views/controller/_partial.html.erb)

So.かなり簡単な質問があります。更新された値にアクセスして、ビューを使って計算を更新する方法を教えてください。私は個人的に私が部分ファイルとjsファイルを持って行くべきだと思っていますが、私はJSファイルが選ばれなかった理由を知りません。それについてのアイデア?

他のオプションがある場合は、ヒントを理解する以上のことがあります。

ありがとうございます!

--edit(コードが付加)

ビュー:

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

- EDIT 2:

OK、どうやら私がこのようにしたいような何かをすることが可能である:

// respond to json request with 
render :json => {"model" => @model} 

との組み合わせで

$('.best_in_place[data-attribute="model_attribute"]').bind(
"ajax:success", function(event, data) { 
    // function that will update whatever 
}); 

&

"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... 
} 

しかし、ここでそれは私にとって終わりです。 私は、format.json {respond_with_bip(@s)}と組み合わせて行う必要があるため、私の場合、render:json => {"model" => @model}の使い方はわかりません。

レンダリングはどこに配置しますか? 現在、これをレスポンスとして500台の内部サーバエラーが発生しています。

私はこの解決策が見つかりましたhereです。

ありがとうございます!

+0

コード(html/jsとコントローラ)を表示する必要があります。それがなければ、我々は仮定を作ることしかできない。たぶんあなたのファイルがピックアップされていないと思うあなたのJSコードにエラーがあります。 –

+0

OK、関連するコードを追加しました。Thx –

答えて

-1

私はちょうどそのような質問答え:

Answer here

ではなく、単にあなたが必要とする合計を使用する必要がある値を挿入するのを。

+0

これは、同じ理由で他の質問に対するあなたの答えがうまくいきません – tehfoo

0

jQueryを使用して、変更されたばかりの要素のdomを解析し、そこから更新された値を取得できます。たとえば、あなたがこのコード(HAML)

= best_in_place @user, :name, :classes => 'name-edit' 

を持っているのその後、あなたのコールバックは、あなたも、jQueryを使って新しい値を調べるスキップすることができ、この(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 

ようになります。あなただけ

$('.name-edit').on 'ajax:success', (event, data, status, xhr) -> 
    $('.some-other-widget').html this.innerHTML 

を行うと、そのように他のウィジェットに新しい値を得ることができるように、コールバックハンドラの文脈では、「これは」要素を表しコールは、から作られました。私の推測では、ajaxハンドラによって返されたイベントもcurrentTargetを持ちます。これはajaxリクエストをトリガしたウィジェットでもあります。私の唯一の心配は、あなたの成功ハンドラが何らかの形でハンドラの中でベストを打ち負かし、更新前にウィジェットを取得することです。私のテストでこれまで起こったことはありません。あなたが別の要求をしたい部分を取得することができますAJAXコールバックで

1

$('.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)) %>");