【问题标题】:Ruby on Rails and jeditable (jquery)Ruby on Rails 和 jeditable (jquery)
【发布时间】:2010-09-18 07:04:31
【问题描述】:

有没有人让 jquery 插件jeditable 在 Rails 应用程序中正常运行。如果是这样,您能否分享一些有关如何设置的提示?我在创建“submit-url”时遇到了一些麻烦。


IIRC,你不能简单地从 javascript 中调用 ruby​​ 代码(请让我错了:-)。你是说RJ吗???这不限于原型吗?我正在使用 jQuery。


更新:
呃......前一段时间问过这个问题,同时切换到不同的解决方案。但 IIRC 我的主要问题如下:

我正在使用 RESTful 资源。因此,假设我必须为博客建模,从而拥有资源“帖子”。如果我想编辑帖子(例如 ID 为 8 的帖子),我的更新将通过 HTTP 发送到带有 HTTP 动词 POST 的 URL http://my.url.com/posts/8。然而,这个 URL 是在我的 Rails 代码中构建的。那么如何将我的提交 URL 放入我的 jQuery 代码中呢?因为这是 RESTful 代码,所以我的更新 URL 会随着每个帖子而改变。

【问题讨论】:

  • 提交网址有什么问题?

标签: jquery ruby-on-rails ruby jeditable


【解决方案1】:

以下是我如何将 JEditable (1.6.2) 与我宁静的 Rails 应用程序 (2.2.2) 连接起来:

内联表单:

<div id="email_name"><%= h( @email.name ) %></div>

$('#email_name').editable( <%= email_path(@email).to_json %>, {
  name: 'email[name]',
  method: 'PUT',
  submitdata: {
    authenticity_token: <%= form_authenticity_token.to_json %>,
    wants: 'name'
  }
});

控制器:

def update
  @email = Email.find( params[:id] )
  @email.update_attributes!( params[:email )
  respond_to do |format|
    format.js
  end
end

update.js.erb

<%=
    case params[:wants]
    when 'name' then h( @email.name )
    # add other attributes if you have more inline forms for this model
    else ''
    end
%>

那个 switch 语句有点笨拙。如果 ajax 请求成功并且没有返回任何内容,如果 JEditable 默认只保存提交的值,那就太好了。

【讨论】:

  • 你可以取消那个 case 语句并简单地返回这个:format.js { render :text => @email.send(params[:wants]) }
【解决方案2】:

对不起,我现在才提出这个问题,但我刚刚找到时间再次查看我的代码。我想我通过以下 javascript(我在 rails 中的 application.js)解决了我的问题:

jQuery(document).ready(function($) {

$(".edit_textfield").each( function(i) {
  $(this).editable("update", {
         type      : 'textarea',
         rows      : 8,
         name : $(this).attr('name'),
         cancel    : 'Cancel',
         submit    : 'OK',
         indicator : "<img src='../images/spinner.gif' />",
         tooltip   : 'Double-click to edit...'
     })
 });
});

如果您的控制器 URL 是 RESTful,则此方法有效。

【讨论】:

  • 它如何知道要提交到哪个 URL?
  • post url 恰好与 show 操作相同,如果未指定其他内容,则表单默认为相同的 url。不同之处在于 http 方法,rails 会相应地路由它。
【解决方案3】:

如果您在 html 中包含 .js 文件,则不可以,但如果您的视图模板中有 js 内联,则可以。

您还可以拥有 .erb.js 文件,即 js 视图。

一切皆有可能:D

【讨论】:

【解决方案4】:

我不确定我是否完全理解您遇到的问题,但我认为您可以在您的 javascript 中添加这样的内容:

<%= url_for(@post) %>

这取决于您如何构建 javascript、如何组织文件等...

【讨论】:

    【解决方案5】:

    如果您是控制器,则不那么安宁。特别是如果您有更新特定字段的操作,那么这也可以。密钥正在传递身份验证令牌。

    index.html.erb

    <span id="my_edit"><%= foo.bar %></span>
    
    <script type="text/javascript">
      $(document).ready(function() {
        $("#my_edit").editable('<%= url_for(:action => "update_bar", 
                      :id => foo) %>',
                        {
                           method: 'PUT',
                           cancel    : 'Cancel',
                           submit    : 'OK',
                           indicator : "<img src='../images/spinner.gif' />",
                           tooltip   : 'Double-click to edit...',
                           submitdata: {
                             authenticity_token: <%= form_authenticity_token.to_json %>,
                           }
                         }
        });
    </script>
    

    过度简化的控制器并不能证明不平静:

    foo_controller.rb

    def update_bar
        foo = Foo.find(params[:id])
        bar= params[:value]
                // insert justifiable code here
        foo.save
        render :text=>params[:value]
    end
    

    (与带有 Jeditable 1.7.0 和 jRails 0.4 的 Rails 2.2.2 和 2.3.2 一起使用,尽管 jRails 除了为 jQuery 1.5 提供包含之外并没有在这里进行太多交互)

    【讨论】:

      猜你喜欢
      • 2011-02-10
      • 1970-01-01
      • 2011-08-28
      • 2018-06-25
      • 1970-01-01
      • 2018-01-20
      • 2011-07-14
      • 1970-01-01
      • 2017-04-24
      相关资源
      最近更新 更多