问题描述 我用 rails_kindeditor,做富文本编辑器。当上传图片的时候,会把图片存储在本地磁盘上。当我想把该条记录删除时。我也想把该条记录中上传的图片给删除。我应该怎么操作。 我应该如何拿到这个图片路径?
kindeditor 本身没有管理或者删除文件地接口,删除文件得自己来实现。
rails_kindeditor 可以存储上传文件的信息,至于删除功能要自己实现,下次有时间把这个需求和功能加进去。
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]
@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 楼的回复,浪费你宝贵时间,谢谢啦
@Macrow 你好,我用 kindeditor 遇到一个问题想请教一下您,因为我用了 turbolinks,所以我加了'data-no-turbolink' => true 但是要按一下 F5 刷新编辑器才出来,后来我在 coffeescript code 里加入那段代码,不用刷新就能出来,但是和 kindeditor_assets 关联不起来,我把数据删了,但图片删不掉, (PS 不加那段代码是可以删图片的)请问是什么原因?知道吗?谢谢
@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
<%= 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 的 虽然知道问题所在,但还是不知到怎样解决,请问你知道吗?