2013-12-02 3 views
1

Я использую Clearance 1.1.0 драгоценный камень с Ruby on Rails 4.0.1. Я пытаюсь переопределить контроллер сеансов, чтобы предоставить свой собственный метод. Я не смог успешно использовать рельсы для использования моего контроллера.Пытается переустановить контроллер в самоцвете разметки Thoughtbot для Rails

/app/controllers/sessions_controller.rb

class SessionsController < Clearance::SessionsController 
    private 

    def flash_failure_after_create 
     flash.now[:notice] = translate(:bad_email_or_password, 
     :scope => [:clearance, :controllers, :sessions], 
     :default => t('flashes.failure_after_create', :new_password_path => new_password_path).html_safe) 
    end 
end 

Я попробовал несколько разные вещи внутри моего routes.rb файла, и не увенчались успехом. Я хочу изменить маршрут sign_in.

get '/sign_in' => 'sessions#new', :as => 'sign_in' 

Уступает следующую ошибку.

Вы можете определили два маршрута с тем же именем, используя :as вариант, или вы можете быть перекрытым маршрут уже определен ресурсом с тем же именованием.

Любые идеи? Спасибо!

Редактировать: Я допустил ошибку. Мне действительно нужны сеансы # create для использования моего контроллера. Я пытаюсь передать другую переменную в файл yaml для флэш-памяти при неудачной попытке входа в систему.

Редактировать 2: Я соответствующий сеанс # создаю строку для моих маршрутов. В моем контроллере сеанса я скопировал и отредактировал для тестирования метода flash_failure_after_create. Это не называется. Поэтому я затем копирую метод create. Теперь мой метод создания вызывается, но не мой метод flash_failure_after_create. Чтобы получить его, я должен был создать метод create, скопированный из gem, и изменил status.failure_message, чтобы напрямую вызвать метод flash_failure_after_create. Это какая-то ошибка с оформлением?

routes.rb

post 'session' => 'sessions#create', :as => nil 

sessions_controller.rb

class SessionsController < Clearance::SessionsController 
    def create 
    @user = authenticate(params) 

    sign_in(@user) do |status| 
     if status.success? 
     redirect_back_or url_after_create 
     else 
     #flash.now.notice = status.failure_message 
     flash.now.notice = flash_failure_after_create 
     render :template => 'sessions/new', :status => :unauthorized 
     end 
    end 
    end 

    private 

    def flash_failure_after_create 
     # Changed flash for easy testing 
     flash.now[:notice] = 'Ballz.' 
     #flash.now[:notice] = translate(:bad_email_or_password, 
     # :scope => [:clearance, :controllers, :sessions], 
     # :default => t('flashes.failure_after_create', :sign_up_path => sign_up_path).html_safe) 
    end 
end 
+0

Похоже, что flash_failure_after_create было устарело [это изменение] (https://github.com/thoughtbot/clearance/commit/2c930b0d0a7b8569e34ed27b0e9ab8d94a90caf9). I18n теперь лучший способ изменить это сообщение, но это не позволит вам изменить какие-либо параметры, используемые для интерполяции. Я открыл и выпустил в Clearance (https://github.com/thoughtbot/clearance/issues/378) –

ответ

2

Я считаю, что это будет работать:

get '/sign_in' => 'sessions#new', :as => nil 

Rails 4 больше не поддерживает верховные имена маршрутов, так что не Назовите свое переопределение. Отображение остается тем же, поэтому sign_in_path должен по-прежнему работать.

+0

Мне действительно нужны сеансы # create для использования моего контроллера. Я допустил ошибку. Изменив ваш пример, соответственно, пост 'session' => 'sessions # create',: as => nil не дает ошибки при запуске маршрутов рейка. Тем не менее, приложение по-прежнему не использует мой контроллер вместо контроллера gem. –

+0

Хм. Вы перезапустили приложение? Ваш маршрут, который вы написали (теперь неназванный) и маршрут проезда ('sign_in_path'), направляется на сеансы # new. Контроллер 'session' должен находиться перед контроллером сессий Clearance в пути загрузки, поэтому он должен просто работать ... –

+0

Я перезапустил приложение и проверил журналы веб-кирпичей.Теперь у меня есть «Обработка с помощью SessionController # create as HTML». Мой контроллер вызывается! Woohoo! Однако мой метод flash_failure_after_create не вызывается. Я знаю это, потому что я могу оставить метод пустым, и флэш-сообщение по-прежнему отображается с настройками по умолчанию на странице. –