Gem simditor 上传文件与 textarea 显示问题 [解决]

brucebot · 2015年12月19日 · 最后由 brucebot 回复于 2015年12月20日 · 6377 次阅读

上一篇帖子https://ruby-china.org/topics/28411 里面,大家推荐的 simditor 太捧了,于是二话不说正在折腾更换 pagedown,使用的是 @stone 推荐的https://github.com/wentaoliu/simditor-rails

目前有两个问题:

  1. 上传文件 [解决], 感谢@springwq
  2. textarea 显示,为什么下面还会有一个 input 的显示框?[解决]

textarea 显示,为什么下面还会有一个 input 的显示框?

加一个 hidden

<%= f.text_field :body, :type=> 'hidden'%>

我的 rails 代码是这样的

<div class="sky-form">
  <%= simple_form_for(@post) do |f| %>
  <fieldset>
    <section>
      <label class="label"><strong><%= t('posts.title') %></strong></label>
      <label class="input"><%= f.text_field :title,placeholder: t('posts.title')%></label>
    </section>

    <label class="label"><strong>Tag</strong></label>
    <label class="input"><%= f.text_field :tag_list, placeholder: t('videos.tagshint') %></label>
    <%= f.text_field :body%>
    <%= f.submit t('posts.post'), :class => 'btn btn-success' %>
    </fieldset>
  </div>
  <% end %>

 <script type="text/javascript">
var editor = new Simditor({
  textarea: $('#post_body'),
  placeholder: '这里输入文字...',
  pasteImage: true,
  upload: {
    url: '/photos',
    // params: null,
    fileKey: 'upload_file',
    connectionCount: 3,
    leaveConfirm: 'Uploading is in progress, are you sure to leave this page?'
  }
});
</script>

上传文件 [解决]

方法:

  ##routes.rb
- resources :photos, only: [:image]
+ post 'photos' => 'photos#image'
def image
    @photo = Photo.new(image: params[:upload_file])
    @photo.user_id = current_user.id
    if @photo.save
      render json: { ok: true, url: @photo.image.url }
    else
      render json: { ok: false }
    end
  end

` 使用以下种直接写入的上传方式没有问题,参考的是http://my.oschina.net/huangwenwei/blog/408998?fromerr=xLh23Gdz的代码,

def image

    file = params[:upload_file]
    file_list = []
    success = true
    msg = '上传成功'
    file_real_path = ''

    if !file.content_type.match(/^image\/(gif|png||jpg||jpeg|){1}$/)
      success = false
      msg = "#{file.original_filename}:只支持上传JPG,JPEG,PNG格式图片"
    elsif file.size > 2*1024*1024
      success = false
      msg = "#{file.original_filename}:图片太大,请上传小于2M的图片"
    end
    if success
      file_real_path = save_file(file)
      file_list << file_real_path
    end
    logger.info file_real_path
    render json: {:success=>success, :msg=>msg,:file_path=>"/#{file_real_path}" }
  end

  private

  def save_file(file)
    extname = file.content_type.match(/^image\/(gif|png|jpg|jpeg){1}$/).to_a[1]
    filename = File.basename(file.original_filename,'.*')
    uri = File.join('photo','images',"#{DateTime.now.strftime('%Y/%m%d/%H%M%S')}_#{SecureRandom.hex(4)}_#{current_user.id}.#{extname}")
    save_path = Rails.root.join('public',uri)
    file_dir = File.dirname(save_path)

    FileUtils.mkdir_p(file_dir) unless Dir.exists?(file_dir)
    File.open save_path, 'wb' do |f|
      f.write(file.read)
    end
    return uri
  end

但是我想把上传写入数据库,使用代码:

def image
    @photo = Photo.new(image: params[:upload_file])
    if @photo.image.blank?
      render json: { ok: false }, status: 400 and return
    end
    @photo.user_id = current_user.id
    if @photo.save
      render json: { ok: true, url: @photo.image.url }
    else
      render json: { ok: false }
    end
  end

photo.image 一直是 nil 的?上传一直不成功? `

上传的话,最好配置好 Carrierwave, 然后修改一下 simditor 的参数,指定好 上传 POST 的路径就行了。

比如 LZ 的 上传,会 POST/photos 这里,这个需要在 PhotosControllerCreate action 里面做下处理。

#1 楼 @springwq 谢谢回复,我的POST是使用PhotosController里面的image action 处理的,代码:

def image
    @photo = Photo.new(image: params[:upload_file])
    if @photo.image.blank?
      render json: { ok: false }, status: 400 and return
    end
    @photo.user_id = current_user.id
    if @photo.save
      render json: { ok: true, url: @photo.image.url }
    else
      render json: { ok: false }
    end
  end

Uploader部分测试是可以用的,现在问题在于上传触发后Photo.image.blank还是 true 的,看起来 uploader 不成功

3 楼 已删除

试试看这样

def image
    @photo = Photo.new(image: params[:upload_file])
    @photo.user_id = current_user.id
    if @photo.save
      render json: { ok: true, url: @photo.image.url }
    else
      render json: { ok: false }
    end
end

#4 楼 @springwq 找到原因了,route 里面不对 原来的 route 是 resources :photos, only: [:image] 改成 post 'photos' => 'photos#image'

再使用你的代码可以了。

非常感谢!

#4 楼 @springwq 这样还是会发生问题,就是你说的

会 POST 到 /posts 这里,这个需要在 PhotosController 的 Create action 里面做下处理。

会有找不能posts/undefined路由的问题,这个在 create 没有写啊?怎么处理呢?

#6 楼 @brucebot 写错了,应该是 photos/create 这里

#7 楼 @springwq commit 完毕后,路由会去找posts/undefined的

json 错误,改为

def create
    @photo = Photo.new
    @photo.image = params[:upload_file]
    @photo.user_id = current_user.id
    success = true
    msg = '上传成功'
    file_path = ''

    if @photo.save
        success=true
      render json: { :success=> success, :msg=>msg, :file_path=> @photo.image.url }
    else
        success=false
      render json: { :success=> false }
    end
end

好了

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