我认为名称和电子邮件等方法在rails中是默认的吗?
在我的静态页面视图中,在profile.html.erb中我有:
<% if logged_in? %>
<% provide(:title, @user.name) %>
<% else %>
<% provide(:title, 'Profile')%>
<% end %>
我输入了static_page_controller
def profile
@user = User.find_by_remember_token(:remember_token)
end
当我转到控制台User.find_by_remember_token(“actualtoken”)。name返回适当的用户名,但是:remember_token没有。我如何制作:remember_token =登录用户记住令牌?
在我的sessions_helper中,我有
def log_in(user)
cookies.permanent[:remember_token] = user.remember_token
current_user = user
end
def logged_in?
!current_user.nil?
end
def current_user=(user)
@current_user = user
end
def current_user
@current_user ||= user_from_remember_token
end
def log_out
current_user = nil
cookies.delete(:remember_token)
end
private
def user_from_remember_token
remember_token = cookies[:remember_token]
User.find_by_remember_token(remember_token) unless remember_token.nil?
end
end
将其复制到我的static_pages_helper并没有完成任何事情。
答案 0 :(得分:2)
你应该了解rails框架和ruby语言的快速事项:
User.anything
将从User类调用静态函数任何; user = User.find_by_anything(the_thing)
是ActiveModel提供的类静态帮助程序,它将查询数据库,查找具有* anything = the_thing *的用户;此用户或nil将被退回; user.an_attribute
将调用一个返回用户指定属性的函数(默认情况下与该属性的列名相同); user.try(:anything)
将尝试从用户调用该函数并返回其值。如果user为nil,则返回的值也将为nil。那就是说,我想你只想检索当前的用户记忆标记,可以通过以下方式完成:
user = current_user.try(:remember_token)
已编辑:问题有点混乱,但我也认为以下代码适用于您的控制器:
def profile
@user = User.find_by_remember_token(params[:remember_token])
end
您必须通过params hash访问请求的参数。
答案 1 :(得分:1)
编辑:完全取代我的第一个答案,希望不是那么愚蠢: - )
(虽然有几种方法可以在Rails中实现和管理会话,但默认情况下在浏览器中使用cookie来引用存储在内存中的密钥。会话是由浏览器的请求创建的,所以虽然它当然可以使用要获得现有会话的控制台,可能不是你想要的。)
因此,您的方法user_from_remember_token将返回用户或nil。我在您的代码中没有看到的是您在用户模型上设置 remember_token的位置。我会假设它在那里,但您可能希望有代码告诉用户如果找不到它们就会登录。一个常见的模式是
def current_user
@current_user ||= user_from remember_token
unless @current_user
flash[:notice] = "Yo! Log in first."
redirect_to login_path and return
end
end
从单独的控制器调用模型查找器没有问题。但为什么要调用User.find_by_remember_token(:remember_token)
- 你还没有remember_token(对吧?)。你不想只在你的会话助手中调用current_user
方法吗?
如果该方法不可见,您可能希望在application_controller.rb