RubyonRails jQuery按钮单击填充文本字段

RubyonRails jQuery按钮单击填充文本字段,jquery,ruby-on-rails,ajax,button,textbox,Jquery,Ruby On Rails,Ajax,Button,Textbox,我的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_

我的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 %>

f、 对象%>
"5" %>
@device.device_标识符,:readonly=>true,:class=>“d-id”,:id=>“deviceIDfield”%>
“deviceIDbutton”,:class=>“btn btn小型btn反向”,:type=>“button”%>
“btn btn大型btn主节点”,:id=>“白色”%>
单击“新设备标识符”时,我希望:device_identifier字段重新生成当前通过Ruby方法SecureRandom.urlsafe_base64设置的值。这只会生成一个随机的base64编码字符串。我一直试图通过jQuery实现这一点,但是我遇到了麻烦,因为我对RubyonRails和jQuery都是新手

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

$(document).ready(function(){
 $('#deviceIDbutton').click(function () {
     $("#deviceIDfield").val('<%= SecureRandom.urlsafe_base64 %>');
     });
})
$(文档).ready(函数(){
$(“#设备按钮”)。单击(函数(){
$(“#设备字段”).val(“”);
});
})
这在我第一次单击按钮时起作用(即,它用新字符串更新设备_标识符字段),但在此之后停止工作。我假设这是因为SecureRandom.urlsafe_base64只被调用一次(当文档准备就绪时?),而不是每次单击按钮时。有人能帮帮我吗!,我在这上面撞了很久了

我对一些事情很不确定,比如为什么我不需要使用:remote=>true-anywhere,以及我是否要使用它放在哪里

此外,我并不确定我对jQuery应该去哪里有正确的想法,尽管它似乎在我创建的shared.js.erb文件中工作,但如果有人能推荐一种更好/更自然的方式,那就太好了

还值得一提的是,我在new.html.erb文件中有相同的按钮,我希望应用相同的功能

非常感谢


Ben

正如您所说,随机字符串只生成一次,但在文档准备就绪时不会生成。当包含在布局中时,shared.js.erb将在服务器端呈现。这将“创建”一个包含内容的shared.js文件,例如:

$(document).ready(function(){
 $('#deviceIDbutton').click(function () {
     $("#deviceIDfield").val('werwe87wer78we7w8erew');
     });
})
ready()调用中的函数是在文档准备就绪时执行的,它将单击事件中要执行的函数绑定到#deviceIDbutton元素。因此,每次单击按钮时,都会执行相同的函数,一次又一次地设置相同的随机代码

函数应该远程调用控制器中返回新安全随机码的方法。您可以使用JQuery.get()实现这一点

如果代码只是一个随机生成的代码,那么可以使用一些JavaScript在浏览器上生成代码,避免调用服务器端


您可以查看调用控制器方法的示例。

是否有关于使用JQuery.get()调用控制器方法的示例代码?感谢您参考其他SO线程。如果你需要进一步的帮助,请告诉我,我仍然在这个问题上犹豫不决……这种方法似乎有点冗长和不自然。是否需要将路线添加到路线文件中?为什么像使用jQuery在单击时填充文本框这样琐碎的事情如此困难?似乎有点不对劲。我在miked的帮助下解决了这个问题,您的答案是正确的,因此我将其标记为正确的,但是如果需要进一步的指导和示例代码,请参阅miked的答案。谢谢