【问题标题】:Trying to override controller in Thoughtbot's Clearance gem for Rails试图在 Thoughtbot 的 Rails Clearance gem 中覆盖控制器
【发布时间】: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

【问题讨论】:

标签: ruby-on-rails ruby-on-rails-4 clearance


【解决方案1】:

我相信这会奏效:

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

Rails 4 不再支持覆盖路线名称,所以不要命名你的覆盖。映射仍然相同,所以 sign_in_path 应该仍然有效。

【讨论】:

  • 我实际上需要 session#create 来使用我的控制器。我犯了一个错误。相应地更改您的示例以发布 'session' => 'sessions#create', :as => nil 在我运行 rake 路由时不会产生错误。但是,该应用程序仍然没有使用我的控制器而不是 gem 控制器。
  • 嗯。您是否重新启动了应用程序?您编写的路线(现在未命名)和 Clearance 的路线(sign_in_path)都指向sessions#new。你的 sessions 控制器应该在加载路径中 Clearance 的会话控制器之前,所以它应该可以工作......
  • 我重新启动了应用程序,并检查了网络砖日志。我现在有“由 SessionsController#create 作为 HTML 处理”。我的控制器正在被调用!呜呼!但是,我的 flash_failure_after_create 方法没有被调用。我知道这一点,因为我可以将方法留空,并且仍然在页面上使用默认值呈现 flash 消息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多