Ruby on rails 从实例变量获取 id

Ruby on rails get id from instance variable

我有一个实例变量@user 所以在 HTML <%=link_to @user %> 中给我结果:

{"id"=>2, "restaurant"=>"sea food", "password"=>"123", "name"=>"a", "email"=>"a", "telephone"=>"123", "created_at"=>"2016-10-09T04:00:24.010Z", "updated_at"=>"2016-10-09T04:00:24.010Z"} 

我想获取 id 的值,但是当我写:<%=link_to @user[:id] %> 它 returns 结果是:/restaurant/home,这是我的 home 函数内部的路由餐厅管理员,我不明白为什么。

这是我的控制器:

class RestaurantController < ApplicationController


def home
    @user = session['loginedUser']
  end



def login

  end

  def checkLogin
    @user = User.find_by_restaurant(params[:user][:restaurant])
    if @user != nil && @user[:password] == params[:user][:password]
        session['loginedUser'] = @user
        redirect_to :controller=>'restaurant',:action=>'home'
    else
        session['loginedUser'] = nil
    #   redirect_to :controller=>'restaurant',:action=>'login'
    end
  end

  def logout
    session['loginedUser'] = nil
    redirect_to :controller=>'restaurant',:action=>'home'
  end
end

有人可以帮忙吗? 非常感谢。

您不应在会话对象中保存复杂的对象。默认情况下,会话数据保存在 cookie 中,许多浏览器只接受 4kB 以内的 cookie。其他问题也存在。

我建议进行此更改:

def checkLogin
   ...
   session['loginedUser'] = @user.id
   ...     
end

def home
  @user = User.find session['loginedUser']
end

您的 link 应该如下所示

<%=link_to id: @user.id %>。这个解决方案并不像 Rails 那样。应该有一个合适的帮手。您可以使用 rake routes | grep home 检查您的路线。您会看到类似 xxx_xxx_home_xxx_restaurant /restaurant/home(.format) restaurant#home 的内容。第一部分是助手名称,您可以添加 _path_url。这可能看起来像 <%=link_to xxx_xxx_home_xxx_restaurant_path id: @user.id %>