2012-03-29 2 views
3

Как я могу гарантировать, что имя controller.action_name вернет правильную информацию? Я полагаюсь на это, чтобы создавать удобные для пользователя сообщения в строке меню. Рассмотрим следующий сценарий.Насколько надежным является метод action_name в рельсах?

Метод action_name отлично работает, когда я использую:

redirect_to edit_profile_path # I get action_name as "edit" in my ApplicationController 

Но это не дает информацию мне нужно, когда я использую следующее:

render :action => "edit" # The action_name shows as "get" instead of "edit" 

Есть ли способ, что я могу использовать визуализации действие и все еще получить правильное имя action_name?

Спасибо, Tabrez

---- фрагменты кода в ответ на комментарий Mischa в ----

Это то, что я имею в контроллере:

def update 
    if @profile.update_attributes(params[:profile]) 
     format.html { 
      flash.now[:notice] = 'Profile was successfully updated.'    
      render :action => "edit" 
     } 
end 

Я не являюсь перенаправление, потому что я все еще хочу, чтобы пользователь оставался в режиме редактирования.

В моем помощнике приложения У меня есть код к следующему эффекту:

if(action_name == "edit" && (can? :read, l_disp_object)) then 
    path_links_subheader.concat(link_to 'Show Saved Version', :controller => controller.controller_path, :action => :show) 
end 

В принципе, если пользователь находится в режиме редактирования, я хочу «Показать сохраненную версию» ссылку в меню. Но, когда я использую синтаксис «render: action», действие изменяется на «get», что имеет смысл в зависимости от того, что упоминал Миша (действие здесь является неправильным). Итак, есть ли способ, которым я могу это сделать, не вызывая перенаправления? Единственная причина, по которой я не использую перенаправление, заключается в том, что логика сохранения текущей вкладки для пользователя работает с действием рендеринга. Возможно, мне придется переписать его, если единственный возможный способ выполнить это - это перенаправить.

+0

Что в вашем файле routes.rb для этого действия? –

+0

Привет, Фредерик. См. Обновленную версию. Я смог проследить проблему до того, как я отображу вид редактирования. – Tabrez

ответ

4

Именование очень запутанно, но render :action => "edit" делает редактирование . Это не имеет ничего общего с действием контроллера . action_name является надежным, но по этой причине вы не можете положиться на него. Откройте новый вопрос и/или поделитесь еще одним кодом предложений о том, как исправить вашу проблему.

+0

Привет Миша - спасибо за ответ. Я добавил фрагменты кода и причины, по которым я еще не перешел на перенаправление. Пожалуйста, просмотрите и дайте мне знать, если есть обходной путь. – Tabrez

+0

Mischa - Спасибо за ответ. По крайней мере, теперь я знаю, почему это не сработало. Я нашел альтернативу для сохранения состояния табуляции, которое теперь позволяет мне использовать перенаправления. Было бы здорово иметь некоторый способ использования инструкции представления рендеринга, не теряя следа действия, которое отображало представление. Итак, если дело доходит до вас, делитесь. Еще раз спасибо! – Tabrez

Смежные вопросы