我刚添加并配置了设计宝石。除了阻止我的表单的自动保存AJAX调用之外,它工作得很好。
在我的控制器顶部,我有:
before_filter :authenticate_user!
我的AJAX呼叫来到同一个控制器:
def autosave
#TODO: update relative entry
#TODO: verify user logged in
#TODO: verify entry belongs to relative user
render content_type: 'text/xml', inline: "<result status='ok' />"
end
当然,我可以改为声明我之前的过滤器:
before_filter :authenticate_user!, except: :autosave
..但这并没有提供任何阻止任何人随时调用此控制器功能的内容。
允许调用此函数的最佳方法是什么?我仍然希望确保只有登录的用户可以进行调用,并且他们正在编辑的给定记录属于他们。
答案 0 :(得分:1)
不完全确定您要做的是什么,但听起来您只需要为自动保存添加一些逻辑。使用此设置,该功能本身仍将被调用,但除非条件正确,否则它是否完成任何事情都是另一个问题。
def autosave
#Verify that the user is signed in and he has ownership of entry
if !current_user.nil? && entry.user == current_user
render content_type: 'text/xml', inline: "<result status='ok' />"
else
#do nothing nothing or redirect with error here
end
end
由于您正在制作AJAX帖子,因此必须为您的ajax调用提供一些额外信息作为安全对策,即CSRF安全令牌。有关使用安全令牌的示例AJAX请求,请参阅Devise not setting current_user on Ajax post even though correct x-csrf-token is included in request header。另外,请确保在头标记中包含<%= csrf_meta_tag %>
。