Ruby on Rails 和 jeditable (jquery)

Posted

技术标签:

【中文标题】Ruby on Rails 和 jeditable (jquery)【英文标题】:Ruby on Rails and 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 会随着每个帖子而改变。

【问题讨论】:

提交网址有什么问题? 【参考方案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

【讨论】:

关于那些 .erb.js 文件,你介意看看我的另一篇文章吗?我真的很感激! ***.com/questions/260476/…【参考方案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 提供包含之外并没有在这里进行太多交互)

【讨论】:

以上是关于Ruby on Rails 和 jeditable (jquery)的主要内容,如果未能解决你的问题,请参考以下文章

Ruby on Rails入门篇

如何在 ruby​​ on rails 中访问 rails 助手和嵌入资产 javascript 文件中的 ruby​​?

Mac上配置 Ruby on Rails和Git

第一个Landing Page的制作方法(Ruby on Rails 開發秘籍 | Ruby on Rails 快速入門)

Ruby on Rails和recaptcha

2020ruby和ruby on rails想说再爱你不容易:安装rails失败解决办法