Ruby on Rails - Heroku问题&用户登录

时间:2012-04-21 05:33:15

标签: ruby-on-rails heroku railstutorial.org

首先发布在SO上。我对Ruby on Rails相对较新,我一直在阅读Michael Hartl的书“Ruby on Rails Tutorial - Learn by Example”。但是,在运行我的应用程序时遇到以下问题,我很慷慨解决。

1)当我尝试在“生产”模式下运行我的应用程序时,我更新了文件'config / environments.rb',如下所示:

    # force Rails into production mode when
    # you don't control web/app server and can't set it the proper way
    ENV['RAILS_ENV'] ||= 'production'

但是,当我运行应用程序时,我仍然可以从文件'app / views / layouts / application.html.erb'中看到调试器工具。

    <!--    Debug applies only to 'development' environment -->
            <%= debug(params) if Rails.env.development? -%>
    <!--    as determined by "if Rails.env.development?"    -->

这让我相信我仍然在开发模式下运行应用程序。

2)对于那些已经问过有关signin_path问题的人,我仍然看不到为我修复它的解决方案。我可以注册用户,然后自动将其重定向到他们的个人资料空间。但是,导航菜单不会相应更改:

<nav class="round">
    <ul>
        <li><%= link_to "Home", root_path -%></li>
        <li><%= link_to "Support", support_path -%></li>
      <% if signed_in? %>
        <li><%= link_to "Users", users_path -%></li>
        <li><%= link_to "Profile", current_user -%></li>
        <li><%= link_to "Settings", edit_user_path(current_user) -%></li>
        <li><%= link_to "Sign out", signout_path, :method => :delete -%></li>
      <% else %>
        <li><%= link_to "Sign in", signin_path -%></li>
      <% end %>

以下是'app / helpers / sessions_helper.rb'文件中的代码:

    def current_user # GET current_user
        @current_user ||= user_from_remember_token
    end

    def signed_in?
        !self.current_user.nil?
    end
    .
    .
    .
    private

        def user_from_remember_token
            User.authenticate_with_salt(*remember_token)
        end

        def remember_token
            cookies.signed[:remember_token] || [nil, nil]
        end

欢迎任何帮助。我目前正在尝试托管我的应用程序Heroku,但遗憾的是没有得到我需要的支持。

干杯。

2 个答案:

答案 0 :(得分:0)

如果问题与heroku服务器有关,请检查link。如果您想在本地运行,rails s -p3001 -e production可能正常工作

答案 1 :(得分:0)

好像是你的签名?助手不是你想要的。那么首先调试signed_in是什么?像这样返回:

<%= signed_in? %>

或者您可以使用signed_in引发错误?作为一条信息。

此外,您似乎忘记了current_user setter方法,该方法应在创建会话后调用。你需要有三种方法:

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

  def user_signed_in?
    !!current_user
  end

  def current_user=(user)
    @current_user = user
    session[:user_id] = if @current_user ? current_user.id : nil
  end

我建议您将此方法作为受保护的方法移动到ApplicationController。

最后一条建议:

!self.current_user.nil?

看起来很糟糕。尽量避免使用爆炸!这应该对你有用:

self.current_user