帮助方法在视图中无法访问

时间:2017-04-23 00:43:42

标签: html ruby-on-rails ruby ruby-on-rails-5

你好我正在使用rails 5,我想要使用帮助方法。

我得到的错误是

NoMethodError in Pages#home
undefined method `logged_in?' for #<#<Class:0x007feb5210b7c0>:0x007feb52109d30>

我正在尝试使用logged_in?在我的局部视图导航栏中。我做错了什么,我不知道发生了什么,我觉得这应该是有效的。欢迎并感谢所有帮助,谢谢!

<nav class="navbar navbar-default">
  <div class="container-fluid">
    <!-- Brand and toggle get grouped for better mobile display -->
    <div class="navbar-header">
      <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1" aria-expanded="false">
        <span class="sr-only">Toggle navigation</span>
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>
      </button>
      <a class="navbar-brand" href="#">Tier-List</a>
    </div>

    <!-- Collect the nav links, forms, and other content for toggling -->

      <form class="navbar-form navbar-left">
        <div class="form-group">
          <input type="text" class="form-control" placeholder="Search">
        </div>
        <button type="submit" class="btn btn-default">Submit</button>
      </form>
      <ul class="nav navbar-nav navbar-right">
        <% if logged_in? %>
            <li><%= link_to "Home", root_path %></li>
            <li><%= link_to "Create new article", new_article_path %></li>
            <li><%= link_to "Logout", logout_path, method: :delete %></li>
            <li><a href="#">Link</a></li>
            <li class="dropdown">
              <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">Dropdown <span class="caret"></span></a>
              <ul class="dropdown-menu">
                <li><a href="#">Action/</a></li>
                <li><a href="#">Another action</a></li>
                <li><a href="#">Something else here</a></li>
                <li role="separator" class="divider"></li>
                <li><a href="#">Separated link</a></li>
                <% else %>
            <li><%= link_to "Login", login_path %></li>
            <li><%= link_to "Sign up", signup_path%></li>
            <% end %>
          </ul>
        </li>
      </ul>
    </div><!-- /.navbar-collapse -->
  </div><!-- /.container-fluid -->
</nav>

应用程序控制器

  helper_method :current_user
  helper_method :logged_in?

  def current_user
    @current_user ||= User.find(session{:user_id}) if session[:user_id]
  end

  def logged_in?
    !!current_user
  end

  def require_user
    if !logged_in?
      flash[:danger] = "You must be logged in to perform that action"
      redirect_to root_path
    end
  end

PagesController.rb

class PagesController < ActionController::Base
  def home
  @articles = Article.all
  end

def tierlist

  end

end

2 个答案:

答案 0 :(得分:2)

我认为这是因为拼写错误。您可以将helper_method :logged_in?更改为helper_method :logged_in或将def logged_in更改为def logged_in?。方法名称和helper_method的参数应该相同。

您的PagesController应该延长ApplicationController,因此PagesController可以包含您在ApplicationController中设置的所有内容。

答案 1 :(得分:0)

{}周围的:user_id应为[:user_id]。由于此错误,您的current_user方法已被破坏,因此在!!current_user方法中调用logged_in?并未给出预期结果。应用程序控制器中最有效的模式类似于:

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

helper_method :current_user

def current_user?(user)
  current_user == user
end

然后在你的视图中,你会有类似的东西:

<% if current_user?(@user) %>
  #show stuff that only signed in Users see
<% end %>

希望这可以解决你的错误。

相关问题