0

edit.html.erb ページに次のフォームがあります

<%= form_for(@device) do |f| %>

  <%= render 'shared/error_messages', :object => f.object %>

  <%= f.label :name %>
  <%= f.text_field :name %>

  <%= f.label :description %>
  <%= f.text_area :description, :rows => "5" %>

  <%= f.label :device_identifier %>
  <%= f.text_field :device_identifier, :value => @device.device_identifier, :readonly => true, :class => "d-id", :id => "deviceIDfield" %>


  <%= button_tag "New device identifier", :id => "deviceIDbutton", :class => "btn btn-small btn-inverse", :type => "button" %>

  <%= f.submit "Save changes", :class => "btn btn-large btn-primary", :id => "white" %>
<% end %>

[新しいデバイス識別子] をクリックすると、:device_identifier フィールドで、Ruby メソッド SecureRandom.urlsafe_base64 で現在設定されている値を再生成する必要があります。これは単純に base64 でエンコードされたランダムな文字列を生成します。私はjQueryを使ってこれをやろうとしていますが、Ruby on RailsとJQueryの両方が初めてなので問題があります。

javascripts ディレクトリにある shared.js.erb というファイルをセットアップしました。ここには次のコードがあります...

$(document).ready(function(){
 $('#deviceIDbutton').click(function () {
     $("#deviceIDfield").val('<%= SecureRandom.urlsafe_base64 %>');
     });
})

これは、ボタンを初めてクリックしたときに機能します (つまり、device_identifier フィールドを新しい文字列で更新します) が、その後は機能しなくなります。これは、ボタンがクリックされるたびではなく、SecureRandom.urlsafe_base64 が 1 回 (ドキュメントの準備ができたとき..?) 呼び出されるためだと思います。誰かが私を助けてくれませんか!、私はこれについてあまりにも長い間頭を悩ませてきました。

:remote => true をどこでも使用する必要がない理由や、使用する場合はどこに置くべきかなど、いくつかのことについて非常に確信が持てません。

また、jQueryがどこに行くべきかについて正しい考えを持っているとは決して確信していません.私が作成したshared.js.erbファイルで動作しているように見えますが、素晴らしいことだ。

また、同じ機能を適用したい new.html.erb ファイルに同じボタンがあることにも言及する価値があります。

どうもありがとう!

ベン

4

1 に答える 1

0

あなたが言ったように、ランダムな文字列は一度だけ生成されますが、ドキュメントの準備ができたときは生成されません。shared.js.erbは、レイアウトに含まれている場合、サーバー側でレンダリングされます。これにより、次のようなコンテンツを含むshared.jsファイルが「作成」されます。

$(document).ready(function(){
 $('#deviceIDbutton').click(function () {
     $("#deviceIDfield").val('werwe87wer78we7w8erew');
     });
})

ready()呼び出しの関数は、ドキュメントの準備ができたときに実行され、クリックイベントで実行される関数を#deviceIDbutton要素にバインドします。したがって、ボタンをクリックするたびに、同じ関数が実行され、同じランダムコードが何度も設定されます。

関数は、新しい安全なランダムコードを返すコントローラーのメソッドをリモートで呼び出す必要があります。これは、JQuery.get()を使用して実行できます。

コードがランダムに生成されるコードになる場合は、サーバー側への呼び出しを回避して、JavaScriptを使用してブラウザーで生成できます。

コントローラメソッドの呼び出しの例については、この他のSOの答えを見ることができます。

于 2012-04-19T13:41:46.157 に答える