修改下 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:
-
def in_place_edit_for(object, attribute, options = {})
-
define_method("set_#{object}_#{attribute}") do
-
@item = object.to_s.camelize.constantize.find(params[:id])
-
if @item.update_attributes({attribute.to_sym => params[:value]})
-
render :text => @item.send(attribute).to_s
-
else
-
render :text => @item.errors.on(attribute.to_sym)
-
end
-
end
-
end
也可以加个样式着重下错误信息:
-
render :text => "<span style='color:red;'>#{@item.errors.on(attribute.to_sym)}</span>"
protect_from_forgery 的问题只要加上 authenticity_token 参数就可以了:
lib/in_place_macros_helper.rb:
-
def in_place_editor_field(...)
-
...
-
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 })
-
...
-
end
这样就 OK 了,效果还不错: