如何通过视图轨将信息从一个控制器传递到另一个控制器

时间:2015-11-04 10:34:54

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

我正在进行预订项目,登录后我想通过主页将会话控制器中的当前用户信息传递给预订控制器。我怎样才能做到这一点?我一直关注Michael Hartl的Rails Tutorial进行登录。这是我在Sessions控制器的创建部分中尝试过的内容

render home_path :local_variables[:id => user_id]

和home_path(用户#home)

<%= link_to new_reservation_path(:user_id => :id) %>

但是它显示了一个未定义的方法错误。我的预订模型有一个user_id列。我对此事感到困惑。我该怎么办?

1 个答案:

答案 0 :(得分:1)

render home_path :local_variables[:id => user_id]

我似乎很奇怪地传递当地人(甚至不知道它是否可能,从未见过当地人在渲染视图/部分之外使用过)。

我认为最好的方法是重定向,并在用户成功登录后将其设置在会话中,因此在您的登录操作中:

user = User.find_by_email(params[:user][:email]) # or however you are finding the person trying to login

session[:user] = user
redirect_to home_path

然后在users#home

@user = session[:user]

最后,在视图中:

<%= link_to new_reservation_path(:user_id => @user.id) %>

修改

实际上,在会话中存储对象可能不是一个好主意,而不是

 session[:user] = user

你可以尝试:

 session[:user_id] = user.id

然后找到用户:

@user = User.find(session[:user_id])

如果你仍然得到一个未定义的错误,那么可能是因为用户是nil(除非User模型实际上没有id属性,这可能很奇怪)所以可能会有登录部分的问题,很难说不知道它是什么样的。

如果您需要在每个页面上登录用户,您可以将功能抽象到应用程序控制器中:

before_filter :check_user

def check_user
  @user = User.find(session[:user_id]) if session[:user_id]
end

然后,您可以在应用中的任何位置使用@user实例变量。