Today's the day

向软件大牛炫耀我会焊单片机,向硬件大牛炫耀我会写 Rails,向软硬件大牛炫耀我生物,向软硬件生物大牛炫耀我会折腾期货 -_-bbb

修改下 In Place Editing 插件

In Place Editing 这个插件代码非常简洁,却方便的实现了即时编辑的效果,不过自从从 Rails 的核心移出去之后,貌似就没有再升级过。

首先它不支持 Validate,In Place Editing 的保存不经过检查,即使你 validates_presence_of :name,也可以在 In Place Editing 中把 name 清空并保存,而且这样做了之后,由于 name 没有了文字,也没法点击编辑了。

另外它也不支持 protect_from_forgery。

虽说有个 REST In Place 插件,似乎是 In Place Editing 的替代品,其实稍微修改一下,In Place Editing 就能重放光芒了~

没法 validate 的缘故是因为它用了 update_attribute 的方法更新属性,只要改成 update_attributes 就可以了,然后检查保存是否成功,如果失败,将错误信息显示出来:

lib/in_place_editing.rb:

  1.     def in_place_edit_for(object, attribute, options = {})
  2.       define_method("set_#{object}_#{attribute}") do
  3.         @item = object.to_s.camelize.constantize.find(params[:id])
  4.         if @item.update_attributes({attribute.to_sym => params[:value]})
  5.             render :text => @item.send(attribute).to_s
  6.         else
  7.             render :text => @item.errors.on(attribute.to_sym)
  8.         end
  9.       end
  10.     end

也可以加个样式着重下错误信息:

  1. render :text => "<span style='color:red;'>#{@item.errors.on(attribute.to_sym)}</span>"

protect_from_forgery 的问题只要加上 authenticity_token 参数就可以了:

lib/in_place_macros_helper.rb:

  1.   def in_place_editor_field(...)
  2.     ...
  3.     in_place_editor_options[:url] = in_place_editor_options[:url] || url_for({ :action => "set_#{object}_#{method}", :authenticity_token => form_authenticity_token, :id => tag.object.id })
  4.     ...
  5.   end

 这样就 OK 了,效果还不错: