再来讨论个问题,最简单的权限问题。
个人博客里很简单的两种角色:游客和主人。不考虑多用户。
对一个页面,不同的权限显示的内容稍有不同,比如一个文章的页面,主人可以看见文章内容、评论以及其它任何游客能看见的东西,但主人还可以看见“删除”、“编辑”这些链接。这种情况是维护2个页面,还是在同一个页面里写逻辑判断?或者是用其它什么办法?
我这现在有3种解决办法:
1、每个页面里写逻辑,判断当前浏览者是否主人,如果是,则显示“删除”、“修改”的链接;反之则不显示。
2、做两个模板(show.html.erb和show_4admin.html.erb),把其中相同的部分(比如文章内容、评论内容等)抽取出来,做为局部模板。在渲染模板的时候做判断(也就是在action里写判断逻辑),选择show还是show_4admin。
3、有人提到用JavaScript来控制链接的显示,我自己觉得这种方法不太可取,没有多去考虑。
我目前用的是第2种方法,但这有些问题:
1)在action里写权限逻辑合适不合适?有没有类似Spring AOP的解决方案?
2)这个问题有关REST,REST不提倡通过HTTP的POST、GET、PUT、和DELETE以外的方法来指定action,但在这里,游客还好办,直接format.html,连render都不用写。如果是博客主人,这时候show_4admin这个名字跟show这个action对不上,不是又得像这样 format.html render(:action => 'show_4admin')显式指定action了吗?或者用 :template => 'blogs/show_4admin',这也一样。
[解决办法]
第四种方法:custome tag
<%=link_to "编辑", :action=>:edit%>
在你自己写的plugin里,加上:
ActionView::Helpers::UrlHelper.class_eval do
alias :old_link_to :link_to
def link_to(name, options = {}, html_options = nil, *parameters_for_method_reference)
nolink_text = html_options.delete(:nolink_text) if html_options
if role_check(options)
old_link_to(name, options, html_options, *parameters_for_method_reference)
elsif nolink_text
return name
end
end
end
role_check检查有没有权限.
这样你写view的时候,压根不用去考虑权限问题.