我在我的Rails 3应用程序中使用简单导航gem。它工作正常,除了一个小怪癖。在Rails 3中使用简单导航gem会在渲染上显示适当的菜单:create
我有一个包含菜单的第二层级上的侧边栏DIV,那得到的显示!render_navigation(:level => 2).nil?
它的工作除了在一个特殊的情况下,罚款。比方说,我有一个模型ContactAttempt。一个普通用户(即使他们没有登录)可以创建一个新的ContactAttempt,在控制器中保存记录,然后将通知邮件发送给相应的部门。 此外,管理员能够列出所有记录(索引)并查看每一个(显示),编辑和更新都被禁用。这只是一个联系表单,除了恶意原因之外,不需要编辑或更新记录。
这里是我的导航是如何设置,现在(从navigation.rb)
primary.item :contact_us, 'Contact Us', new_contact_attempt_path do |secondary|
secondary.item :send_email, 'Send Email', new_contact_attempt_path
if user_signed_in? and current_user.admin?
secondary.item :list_contact_attempts, 'List of Contact Attempts', contact_attempts_path
end
end
我的问题是,当用户尝试提交信息不通过验证(如不回复电子邮件,或消息包含非法字符),表单再次显示所有错误。但即使你的current_action == "create"
,实际的网址变成"localhost:3000/contact_attempts
。这意味着为了简单导航它看起来像路径是contact_attempt_path,并且不会生成secondary.item:new_contact_attempt。我试图使用highlights_on => /contact_attempts
来解决这个问题,它强制在所有视图上生成项目,但随后它会在所有操作中突出显示所有时间 - 这是令人困惑的。
有没有人有任何想法如何解决它?
编辑
好,我能想出一个办法来实现我想要的东西 - 但它似乎很麻烦,我真的不喜欢它:
primary.item :contact_us, 'Contact Us', new_contact_attempt_path do |secondary|
if user_signed_in? and current_user.admin?
if params[:action] == ("create" or "new")
secondary.item :send_email, 'Send Email', new_contact_attempt_path, :highlights_on => /contact_attempts/
secondary.item :list_contact_attempts, 'List of Contact Attempts', contact_attempts_path, :highlights_on => /contact_attempts\/index/
else
secondary.item :send_email, 'Send Email', new_contact_attempt_path
secondary.item :list_contact_attempts, 'List of Contact Attempts', contact_attempts_path
end
else
secondary.item :send_email, 'Send Email', new_contact_attempt_path, :highlights_on => /contact_attempts/
end
end
我会将此标记为明天回答,如果没有人回来,有适当的解决方案。 :-(