Я использую гем простой навигации в своем приложении Rails 3. Он отлично работает, за исключением одной маленькой причуды.
У меня есть 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"
, реальный URL становится "localhost:3000/contact_attempts
. Это означает, что для простой навигации это выглядит так, что путь - это contact_attempt_path, а вторичный.item: new_contact_attempt не генерируется. Я попытался решить эту проблему, используя highlights_on => /contact_attempts
, который заставляет элемент генерироваться во всех представлениях, но затем он постоянно подсвечивает все действия - что сбивает с толку.
У кого-нибудь есть идеи, как ее решить?
EDIT
Хорошо, я смог найти способ достичь того, чего я хочу, но это кажется громоздким, и мне это не очень нравится:
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
Я отмечу это как ответ завтра, если никто не вернется с правильным решением. : - (