试图在Thoughtbot的Clearance gem for Rails中覆盖控制器

时间:2013-12-02 02:33:54

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

我在Ruby on Rails 4.0.1中使用Clearance 1.1.0 gem。我试图覆盖会话控制器以提供我自己的自定义方法。我无法成功使用我的控制器。

/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来使用我的控制器。我试图在会话登录失败时将不同的变量传递给flash的yaml文件。

编辑2:我适当的会话#创建行到我的路线。在我的会话控制器中,我复制并编辑了测试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

1 个答案:

答案 0 :(得分:2)

我相信这会奏效:

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

Rails 4不再支持覆盖路由名称,因此请不要为覆盖命名。映射仍然相同,因此sign_in_path应该仍然有效。