Используя простой навигационный гем в Rails 3, выведите на экран правильное меню: - PullRequest
1 голос
/ 10 марта 2011

Я использую гем простой навигации в своем приложении 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 

Я отмечу это как ответ завтра, если никто не вернется с правильным решением. : - (

1 Ответ

4 голосов
/ 10 марта 2011

Хорошо, я смог найти способ добиться того, чего я хочу, но это кажется громоздким, и мне это не очень нравится:

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 

Я отмечу это как ответ завтра, если никто не вернется с правильным решением. : - (

Кажется, сейчас это лучшее решение, так как оно не реализовано в геме. Открыл тикет на github для andi (создатель).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...