Rails button_to remote搞砸了onclick

时间:2011-06-23 23:00:30

标签: ruby-on-rails ruby-on-rails-3

我有一个Rails 3应用程序尝试使用按钮执行某些控制器操作并且:remote =>真正。目前,我甚至不想担心行动的成功,我只想让它自己发生,并有一些onclick脚本立即隐藏元素。

我似乎无法让他们同时工作。这是我正在使用的代码,它可以很好地执行操作:

<%= button_to "Ignore", url_for(:controller => "requests", :action => "ignore", :id => request.id), :remote=>true %>

现在,当我尝试添加onclick时,该部分会被执行,但突然请求被视为HTML,因此我被发送到新页面而不是将其视为“远程”:

<%= button_to "Ignore", url_for(:controller => "requests", :action => "ignore", :id => request.id), :remote=>true, :onclick => "ignore('request_'"i.to_s"')" %>

据我所知,按钮的代码创建得很好,并且onclick工作正常,但添加它会使请求搞砸。有人可以帮帮我吗?非常感谢

2 个答案:

答案 0 :(得分:2)

您的onclick属性有错误。

<%= button_to "Ignore", url_for(:controller => "requests", :action => "ignore", :id => request.id), :remote=>true, :onclick => "ignore('request_#{ i.to_s }'); return(false);" %>

但是,你应该考虑不引人注意地这样做。

<%= button_to "Ignore", url_for(:controller => "requests", :action => "ignore", :id => request.id), :remote=>true, :'data-ignore-id' => i %>

然后在application.js

$('[data-ignore-id]').live('click', function(ev) {
    ev.preventDefault();
    var ignoreId = "request_" + $(this).attr('data-ignore-id').toString();
    ignore(ignoreId);
});

更新

问题是,当你提供url_for时,button_to帮助器正在构建一个表单。对于你想要阻止的动作是onsubmit而不是onclick。

<%= button_to "Ignore", url_for(:controller => "requests", :action => "ignore", :id => request.id), :remote=>true, :'data-ignore-id' => i %>

然后在application.js

$('[data-ignore-id]').submit(function(ev) {
    ev.preventDefault();
    var ignoreId = "request_" + $(this).attr('data-ignore-id').toString();
    ignore(ignoreId);
});

更新#2 - 由于data-ignore-id attr的位置而发生变化。

<form method="post" action="/requests/41/ignore" data-remote="true" class="button_to">    
    <div>
        <input data-ignore-id="0" type="submit" value="Ignore" />
        <input name="authenticity_token" type="hidden" value="7S3K+ZFhSZij1ZAmSeggG0SpPozNwHBk4zxjegLIiKs=" />
    </div>
</form>

将活动更改为。

$('form > div input[data-ignore-id]').submit(function(ev) {
    ev.preventDefault();
    var ignoreId = "request_" + $(this).find('input[data-ignore-id]').attr('data-ignore-id').toString();
    ignore(ignoreId);
});

答案 1 :(得分:1)

这可能很有用

=link_to "value", "javascript:function()", class: 'btn btn-default'