【问题标题】:Helper methods aren't accessable in views视图中无法访问辅助方法
【发布时间】:2017-04-23 00:43:42
【问题描述】:

您好,我正在使用 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

【问题讨论】:

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


    【解决方案1】:

    我认为这是因为错字问题。您可以将helper_method :logged_in? 更改为helper_method :logged_in 或将def logged_in 更改为def logged_in?helper_method的方法名和参数应该是一样的。

    您的PagesController 应该扩展ApplicationController,因此PagesController 可以拥有您在ApplicationController 中设置的所有内容。

    【讨论】:

    • 嗯谢谢把它们都改成了logged_in?不幸的是仍然给出同样的错误
    • 你有pages_controller.rb吗?请给我看。
    • 你的 PagesController.rb 应该扩展 ApplicationController.rb: class PagesController &lt; ApplicationController
    • 现在的错误是:ActiveRecord::RecordNotFound in PagesController#home
    • Couldn't find User with 'id'=#<:request::session:0x007f7fd448cd20> 然后它抱怨 def current_user @current_user ||= User.find(session{:user_id }) 如果会话[:user_id] 结束
    【解决方案2】:

    :user_id 周围的{} 应该是[:user_id]。由于这个错字,您的 current_user 方法已损坏,因此在 logged_in? 方法中调用 !!current_user 不会给出预期的结果。应用程序控制器中效果最好的模式类似于:

    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 %>
    

    希望这能消除您的错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-24
      • 1970-01-01
      • 2014-11-19
      • 1970-01-01
      • 1970-01-01
      • 2020-04-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多