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 都是新手。

我设置了一个名为 shared.js.erb 的文件,它位于我的 javascripts 目录中。在这里,我有以下代码...

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

这在我第一次单击按钮时有效(即它使用新字符串更新 device_identifier 字段)但是在此之后停止工作。我认为这是因为 SecureRandom.urlsafe_base64 被调用一次(当文档准备好时......?)而不是每次单击按钮时。有人可以帮帮我吗!,我一直在努力解决这个问题太久了。

我很不确定一些事情,例如为什么我不需要在任何地方使用 :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 回答