我在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 =&gt;在任何地方都是如此,如果我要用它放在哪里呢?
另外,我无法确定我对jQuery应该去哪里有正确的想法,虽然它似乎适用于我创建的shared.js.erb文件,如果有人可以推荐更好/更多自然的方式会很棒。
还值得一提的是,我在new.html.erb文件中有相同的按钮,我想要应用相同的功能。
非常感谢!
本
答案 0 :(得分:0)
正如您所说,随机字符串仅生成一次,但在文档准备好时则不生成。当布局包含shared.js.erb时,它将在服务器端呈现。这将“创建”带有内容的shared.js文件,例如:
$(document).ready(function(){
$('#deviceIDbutton').click(function () {
$("#deviceIDfield").val('werwe87wer78we7w8erew');
});
})
当文档准备好并且将要在click事件上执行的函数绑定到#deviceIDbutton元素时,就会执行ready()调用中的函数。因此,每次单击按钮时,执行相同的功能,反复设置相同的随机代码。
您的功能应该是对控制器中返回新安全随机代码的方法进行远程调用。您可以使用JQuery.get()。
来完成此操作如果代码只是一个随机生成的代码,你可以在浏览器上生成一些JavaScript,避免调用服务器端。
有关调用控制器方法的示例,您可以看到this other SO answer。