【发布时间】:2013-12-02 02:33:53
【问题描述】:
我正在使用Clearance 1.1.0 gem 和 Ruby on Rails 4.0.1。我正在尝试覆盖会话控制器以提供我自己的自定义方法。我无法成功让 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定义了两条同名路由 选项,或者您可能正在覆盖已由资源定义的路由 同名。
有什么想法吗?谢谢!
编辑:我犯了一个错误。我实际上需要 session#create 来使用我的控制器。当会话登录失败时,我正在尝试将不同的变量传递给 flash 的 yaml 文件。
编辑 2: 我将相应的 session#create 行添加到我的路线。在我的会话控制器中,我复制并编辑了用于测试 flash_failure_after_create 方法。它没有被调用。因此,我将 create 方法复制过来。现在,我的 create 方法被调用,但不是我的 flash_failure_after_create 方法。为了让它被调用,我必须从 gem 复制 create 方法,并将 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
【问题讨论】:
-
似乎 flash_failure_after_create 已被this change 淘汰。 I18n 现在是更改该消息的最佳方式,但不允许您更改任何用于插值的参数。我有opened and issue in Clearance
标签: ruby-on-rails ruby-on-rails-4 clearance