将实例变量传递给Devise中的视图

时间:2013-12-04 22:51:47

标签: ruby-on-rails devise

在控制器中我尝试做以下事情:

class UsersController < Devise::RegistrationsController

  def new
    super
    @test = "hello"
  end

end

显然在new.html.erb我有<%= @test %>,但没有任何吸引力! hello字符串未显示。

如果我这样做

class UsersController < Devise::RegistrationsController

  def new
    @test = "hello"
    super
  end

end

然后显示字符串......那是怎么回事?为什么会这样?

3 个答案:

答案 0 :(得分:0)

  module Vehicular
    def move_forward(n)
      @position += n
    end
  end

  class Vehicle
    include Vehicular  # Adds Vehicular to the lookup path
  end

  class Car < Vehicle
    def move_forward(n)
      puts "Vrooom!"
      super            # Calls Vehicular#move_forward
    end
  end

调用没有参数且没有空参数列表,super使用相同的参数调用相应的方法,并使用与调用当前方法相同的代码块。

修改: 在您的示例中,registrations_controller#new方法中有一个respond_with,这就是为什么@test =“hello”没有被执行。

答案 1 :(得分:0)

基于Devise源代码,应该将一个块传递给super()。这是一种快速而肮脏的解决方案。

class UsersController < Devise::RegistrationsController

  def new
    super do |resource|
      @test = "hello"
    end
  end

end

答案 2 :(得分:0)

一种优雅的解决方案可能是创建一个before_action过滤器,仅用于:new方法。并设置@test实例变量。

class UsersController < Devise::RegistrationsController

  before_action :set_test, only: [:new]

  def new
    super
  end

  private

  def set_test
    @test = "hello"
  end

end