【问题标题】:Ruby on Rails jQuery button click populate text_fieldRuby on Rails jQuery 按钮单击填充 text_field
【发布时间】:2012-04-19 13:29:35
【问题描述】:

我的 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 文件中有相同的按钮,我想应用相同的功能。

非常感谢!

【问题讨论】:

    标签: jquery ruby-on-rails ajax button textbox


    【解决方案1】:

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

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

    ready() 调用中的函数在文档准备就绪时执行,该函数将单击事件上要执行的函数绑定到#deviceIDbutton 元素。因此,每次单击按钮时,都会执行相同的功能,一次又一次地设置相同的随机代码。

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

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

    调用控制器方法的例子可以看this other SO answer

    【讨论】:

    • 是否有关于使用 JQuery.get() 调用控制器方法的示例代码?谢谢
    • 为此添加了对其他 SO 线程的引用。如果您需要进一步的帮助,请告诉我
    • 我仍然被这个问题所困扰...这种方法似乎有点啰嗦和不自然。我需要向我的路线文件添加路线吗?为什么像使用 jQuery 在单击时填充文本框这样微不足道的事情如此困难?似乎有些不对劲。
    • 我在 miked 的帮助下解决了这个问题 link 您的答案是正确的,所以我已经将其标记为正确,但是如果有人需要进一步的指导和示例代码,请参阅 miked 的答案。谢谢
    猜你喜欢
    • 2011-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多