新手问题 rails_kindeditor 删除内容中的图片

frank · 2013年08月01日 · 最后由 Macrow 回复于 2015年03月27日 · 4279 次阅读

问题描述 我用rails_kindeditor,做富文本编辑器。当上传图片的时候,会把图片存储在本地磁盘上。当我想把该条记录删除时。我也想把该条记录中上传的图片给删除。我应该怎么操作。 我应该如何拿到这个图片路径?

共收到 25 条回复

kindeditor 本身没有管理或者删除文件地接口,删除文件得自己来实现。

rails_kindeditor 可以存储上传文件的信息,至于删除功能要自己实现,下次有时间把这个需求和功能加进去。

今天加班已把所描述的功能加上,详细说明见ReadMe。

https://github.com/Macrow/rails_kindeditor

@Macrow :owner_id => @xxx.id 这个功能好像不行

@tailang

1.需要数据库记录

rails generate rails_kindeditor:migration
rake db:migrate

2.指定owner_id

<%= f.kindeditor :content, :owner_id => @article.id  %>

3.在你自己的模型里加入has_many_kindeditor_assets

class Article < ActiveRecord::Base
  has_many_kindeditor_assets :attachments, :dependent => :destroy
  # has_many_kindeditor_assets :attachments, :dependent => :nullify
  # has_many_kindeditor_assets :your_name, :dependent => :destroy
end

这三个步骤都完成了吗?

@Macrow 嗯嗯 按照README来的

<%= f.kindeditor :comment, :simple_mode => true, :owner_id => @comment.id, :width => 700, :height => 200 %>

:owner_id的参数位置应该无关吧?

@tailang 参数是通过hash传递的,顺序无关。

你的log贴出来看看吧,或者看看代码。

我觉得是你的Comment没有创建导致的,这里有一个先后逻辑问题,因为comment没有创建,所以你的@comment.id本身是nil。

在README里面我有说明,是不是 没注意到?

# 警告: @article应该事先被创建,@article.id不应该是空的。

@Macrow 下面的是和我的post有关的 model

class Post < ActiveRecord::Base
  attr_accessible :body, :title, :tag_list

  has_many_kindeditor_assets :attachments, :dependent => :destroy 
  acts_as_taggable
  acts_as_commentable
  default_scope :order => 'id DESC'

  validates :title, :presence => true
  validates :body, :presence => true
end

form

<div class="field" >
   <%= f.label :body, "正文" %>
   <%= f.kindeditor :body, :simple_mode => true, :owner_id => @post.id, :width => 700, :height => 400 %><br>
 </div>

show

<%= safe @post.body %> #safe是一个html_safe的方法

下面是删除post时与kindeditor有关的

Started DELETE "/posts/14" for 127.0.0.1 at 2013-08-12 22:07:23 +0800
Processing by PostsController#destroy as HTML
  Parameters: {"authenticity_token"=>"zjuURXhL98MnxDJIEEUcPNsF0L7ZeqRKeKhW1/uRW7w=", "id"=>"14"}
  User Load (0.3ms)  SELECT "users".* FROM "users" WHERE "users"."id" = 1 LIMIT 1
  Post Load (0.2ms)  SELECT "posts".* FROM "posts" WHERE "posts"."id" = ? ORDER BY id DESC LIMIT 1  [["id", "14"]]
   (0.1ms)  begin transaction
  Kindeditor::Asset Load (0.2ms)  SELECT "kindeditor_assets".* FROM "kindeditor_assets" WHERE "kindeditor_assets"."owner_id" = 14
  ActsAsTaggableOn::Tagging Load (0.2ms)  SELECT "taggings".* FROM "taggings" WHERE "taggings"."taggable_id" = 14 AND "taggings"."taggable_type" = 'Post'
  SQL (0.3ms)  DELETE FROM "taggings" WHERE "taggings"."id" = ?  [["id", 15]]
  ActsAsTaggableOn::Tagging Load (0.2ms)  SELECT "taggings".* FROM "taggings" WHERE "taggings"."taggable_id" = 14 AND "taggings"."taggable_type" = 'Post' AND (taggings.context = ('tags'))
  Comment Load (0.6ms)  SELECT "comments".* FROM "comments" WHERE "comments"."commentable_id" = 14 AND "comments"."commentable_type" = 'Post' ORDER BY created_at DESC
  SQL (0.4ms)  DELETE FROM "posts" WHERE "posts"."id" = ?  [["id", 14]]
   (179.7ms)  commit transaction
Redirected to http://localhost:3000/posts
Completed 302 Found in 257ms (ActiveRecord: 182.0ms)

删除post后对应的图片还在public下

@tailang 从代码上看,应该是没有问题的。

分析log,应该是kindeditor创建assets的时候,owner_id没有写入。

你通过rails c来看看所有assets里面有没有owner_id为14的:

rails c
Kindeditor::Asset.all.map(&:owner_id)

@Macrow 恩 没写入

irb(main):002:0> Kindeditor::Asset.all.map(&:owner_id)
  Kindeditor::Asset Load (0.5ms)  SELECT "kindeditor_assets".* FROM "kindeditor_assets" 
=> [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

@tailang 那你能确定你的form里面@post.id不为空吗?

@Macrow 嗯嗯,不好意思啊,我查了一下,是post.id为空,不过我也有个疑问 我在controller中action new

def new
    @post = Post.new #为<Post id: nil, title: nil, body: nil, created_at: nil, updated_at: nil>,id为空,为了@post.id不为空的话,new的时候就给post.id赋值吗?
end

@tailang 我在6楼不是说了吗,这里有一个先后的问题,在action new里面,@post还没有创建,而这个时候上传图片的时候就完成了附件的创建过程,所以@post应该首先创建,然后再可以创建属于@post的附件。

如果非要加入owner_id的话,我觉得可以指定为@user.id,或者先让用户创建@post

不推荐你说的加入id的方法,即便你通过Model.maximum(:id).next或者Model.last.id+1之类的方法预测了该Model的id,用户也有可能上传附件后选择取消,而且,在你创建Model的时候,id可能已经增长了好几个了(其他用户也在创建)。

@Macrow 额,这个我明白,刚刚也试过了,先创建post,在重新去添加图片。但是这样实现不论是创建带图片的文章还是评论有点麻烦(其实我对这个功能不是一定要有,只是测一下)。前辈不好意思,刚刚没仔细看6楼的回复,浪费你宝贵时间,谢谢啦

不客气,共同学习。

#14楼 @Macrow 不停的使用kindeditor上传图片, 可以无限的上传吗?

@feichan 理论上可以这么做,但如果上传文件涉及到安全问题,或者要考虑每一名用户可上传量的控制问题,就需要更深入的定制和编码了。

@Macrow 你好,我用kindeditor遇到一个问题想请教一下您,因为我用了turbolinks,所以我加了'data-no-turbolink' => true 但是要按一下F5刷新编辑器才出来, 后来我在coffeescript code里加入那段代码,不用刷新就能出来,但是和kindeditor_assets关联不起来,我把数据删了,但图片删不掉, (PS不加那段代码是可以删图片的)请问是什么原因?知道吗?谢谢

@osbron 无法删除assets和turbolinks应该是没有关系的,应该是你的owern_id没有设置正确,请仔细检查一下。

@Macrow 刚发现首次点进页面时上传图片 无法删除assets,我按F5刷新一下再上传图片就可以删除assets 一直搞不懂

@Macrow
这是我的action def article_create @article = Article.new() @article.site = @site @article.title = '' @article.save! end

<%= f.kindeditor :content, :owner_id => @article.id,:width => 700,:height => 300 %>

提交action: def article_create_action if request.post? @article = Article.find_by_id(params[:id]) @article.update_attributes(article_params) redirect_to :action => 'articles' end end

@Macrow

<%= f.kindeditor :content, :owner_id => @article.id,:width => 700,:height => 300 %>

提交action: def article_create_action if request.post? @article = Article.find_by_id(params[:id]) @article.update_attributes(article_params) redirect_to :action => 'articles' end end

@Macrow 找到问题了 就是没加载js 要按F5刷新加载JS
<%= javascript_include_tag "application", "data-turbolinks-track" => true %> 我是通过这句话引入js的 虽然知道问题所在,但还是不知到怎样解决,请问你知道吗?

#2楼 @Macrow 我要给kindeditor_assets添加owner_type属性, 1.我给表添加了列, 2.我在f.kindeditor 后添加了:owner_type => xx.class.to_s, 3,我在assets_controller 的create方法里添加了接收params[:owner_type]的代码, 为什我debug看不到传owner_type进来? 谢谢指导!

#24楼 @lizanle 这种情况建议你在assets_controller 的create的方法里进行调试,可以用logger输出params看看有没有你需要传递进来的参数。

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册