麻烦在Rails中使用Session未定义的局部变量或方法

时间:2014-05-19 15:45:15

标签: ruby-on-rails

我在这里有一个设计注册控制器

class Students::RegistrationsController < Devise::RegistrationsController

  def after_sign_up_path_for(resource)
    '/events/new'
  end 

  def after_inactive_sign_up_path(resource)
    '/events/new'
  end 

  def brand
    brand ||= Brand.find(params[:brand]) 
    session[:brand] = Brand.find(params[:brand]) #not working 
  end 
  helper_method :brand 
end

有人注册后会将其发送到活动/新页面

在有人进入注册页面之前,他们必须通过品牌页面

=link_to t('slide2.apply_here'), new_student_registration_path(:brand => brand.id),class: "button-component", style: "font-size: 14px; padding: 10px 50px;"

请注意,品牌ID通过link_to作为注册控制器的参数传递。我有品牌方法来捕获品牌ID,找到品牌并在注册页面的视图中使用它。

我想为events / new做同样的事情,因此在会话中存储Brand。

我继续获取未定义的本地变量或方法品牌。

我在事件新视图中有这个

%h3=brand.name

我知道会话应该很短,应该只是

session[:brand] = params[:brand]

但是现在我的注册页面未定义,它弄乱了我的帮助方法。

更新

我刚把它放在我的事件新视图中

.row
  .span4
    .accordion#picture_accordion.left
    =image_tag brand.image_url
    %h3=brand.name

1 个答案:

答案 0 :(得分:1)

当你说

brand ||= Brand.find(params[:brand]) 

这就像说

brand = brand || Brand.find(params[:brand]) 

如果此时尚未定义brand,您将获得一个&#34;未定义的局部变量或方法&#34;错误。

如果将其更改为实例变量@brand,它应该可以工作,因为未定义的实例变量计算为nil。

编辑 - 这是我的&#39; current_user&#39;方法,听起来可比。

def current_user
  @current_user ||= (session[:user_id] && User.find_by_id(session[:user_id]))
end

这里发生的是第一次调用current_user时,它使用session [:user_id]加载当前用户并将其保存在名为@current_user的实例变量中。下次调用current_user时,在同一个操作中,它只会使用它保存到实例变量中的对象,而不会再次将其加载到数据库中。

请注意,在此系统中,想要知道当前用户是谁的控制器和视图代码应始终呼叫current_user @current_user。 @current_user仅由current_user方法用于保存页面呈现持续时间的值。