我在这里有一个设计注册控制器
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
答案 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
方法用于保存页面呈现持续时间的值。