在用户#show中解决NoMethodError问题

时间:2016-02-03 05:57:49

标签: ruby-on-rails action show

我的应用有三种类型的配置文件:

  • 提供商
  • 专业
  • &安培;导引头

我使用用户索引页面显示这些配置文件以查看所有配置文件。

我遇到的问题是我可以在索引页面上看到所有个人资料,但除非以该类型的个人资料登录,否则无法访问它们。

专业用户个人资料可以查看所有个人资料,但只能访问专业个人资料。

我该如何解决这个问题?我可以看到为什么我在用户中显示NoMethodError#显示错误,符合以下NSNotificationCenter代码;但是,我无法弄清楚如何绕过它。

提前谢谢。

show.html.erb

#show.html.erb

<div class="row">
<% if current_user.provider %>
    <div class="col-md-3 text-center">
        <%= image_tag @user.provider.avatar.url %>
    </div>
    <div class="col-md-6">
        <h1><%= @user.provider.company_name %></h1>
        <h3>Provider</h3>
        <div class="well provider-description">
            <h3>Description</h3>
            <%= @user.provider.description %>
        </div>
        <div class="well provider-contact">
            <h3>Contact Information</h3>
            <%= @user.provider.company_number %>
            <%= @user.provider.company_email %>
        </div>
    </div>


<% elsif current_user.professional %>
    <div class="col-md-3 text-center">
        <%= image_tag @user.professional.avatar.url %>
    </div>
    <div class="col-md-6">
        <h1><%= @user.professional.first_name %> <%= @user.professional.last_name %></h1>
        <h3>Professional</h3>
        <div class="well professional-description">
            <h3>Description</h3>
            <%= @user.professional.description %>
        </div>
        <div class="well professional-contact">
            <h3>Contact Information</h3>
            <%= @user.professional.phone_number %>
            <%= @user.professional.contact_email %>
        </div>
    </div> 

<% elsif current_user.seeker %> 
    <div class="col-md-3 text-center">
        <%= image_tag @user.seeker.avatar.url %>
    </div>
    <div class="col-md-6">
        <h1><%= @user.seeker.first_name %> <%= @user.seeker.last_name %></h1>
        <h3>Seeker</h3>  
          <div class="well seeker-description">
              <h3>Description</h3>
              <%= @user.seeker.description %>
          </div>
          <div class="well seeker-contact">
            <h3>Contact Information</h3>  
            <%= @user.seeker.phone_number %><br/>
            <%= @user.seeker.contact_email %><br/>
         </div>
    </div>
<% end %> 

#index.html.erb
    <div class="row">
<div class="col-md-8 col-md-offset-2">
<ul class="list-unstyled">
  <% @users.each do |user| %>
    <% if user.provider %>
    <li>
      <div class="well row <%= cycle('white-bg', '') %>">
        <div class="col-sm-4 text-center">
          <% if user.provider.avatar %>
            <%= link_to user do %>
              <%= image_tag user.provider.avatar.url(:thumb), class: 'user-index-avatar' %>
            <% end %>
          <% end %>
        </div>
        <div>
          <%= link_to user do %>
            <h2><%= user.provider.company_name %></h2>
          <% end %>
          <p><%= user.provider.description %>
        </div>
      </div>
    </li>
    <% elsif user.professional %>
    <li>
      <div class="well row <%= cycle('white-bg', '') %>">
        <div class="col-sm-4 text-center">
          <% if user.professional.avatar %>
            <%= link_to user do %>
              <%= image_tag user.professional.avatar.url(:thumb), class: 'user-index-avatar' %>
            <% end %>
          <% end %>
        </div>
        <div>
          <%= link_to user do %>
            <h2><%= user.professional.first_name %><%= user.professional.last_name %></h2>
          <% end %>
          <p><%= user.professional.description %>
        </div>
      </div>
    </li>
    <% elsif user.seeker %>
    <li>
      <div class="well row <%= cycle('white-bg', '') %>">
        <div class="col-sm-4 text-center">
          <% if user.seeker.avatar %>
            <%= link_to user do %>
              <%= image_tag user.seeker.avatar.url(:thumb), class: 'user-index-avatar' %>
            <% end %>
          <% end %>
        </div>
        <div>
          <%= link_to user do %>
            <h2><%= user.seeker.first_name %><%= user.seeker.last_name %></h2>
          <% end %>
          <p><%= user.seeker.description %>
        </div>            
      </div>
    </li>
    <% end %>
  <% end %>
</ul>

4 个答案:

答案 0 :(得分:0)

我不确定你想要的行为是什么;但是,您可能想尝试更改以下行:

<% elsif user.seeker %>

到此:

<% elsif current_user.seeker %>

您可能会收到NoMethodError,因为没有user.seeker方法可用。

答案 1 :(得分:0)

我认为问题是before_action :authenticate_user!它验证了所有问题 您在用户控制器中定义的操作意味着它希望用户登录。

尝试将其更改为:before_action :authenticate_user!, except: [:index],因此不需要用户登录。

如果我误解了你的问题,请忽略这个答案。

答案 2 :(得分:0)

该错误与current_user无关 - 您正在评估if current_user.professional,然后调用@user.professional

<% elsif current_user.professional %>
  <%= image_tag @user.professional.avatar.url %>

错误 - 您尚未发布 - 可能是@user没有与之关联的.professional对象。也许我错了,但你的模式对我来说效率不高。

-

  

我怎样才能解决这个问题?

听起来您可以从实施authorization中受益。

我强烈建议您重构User模型:

#app/models/user.rb
class User < ActiveRecord::Base
   has_one :profile
   delegate :profile_type, :professional?, :seeker?, :provider?, to: :profile
end

#app/models/profile.rb
class Profile < ActiveRecord::Base
   belongs_to :user
   enum profile_type: [:provider, :professional, :seeker] #-> requires "profile_type" int column
end

您提到用户可以 其中一种配置文件类型。如果您使用上面的enum,则会获得以下方法:

current_user.provider?
current_user.professional? 
current_user.seeker?

您现在遇到的问题是user has_one :professional无法 来定义用户是否为professional等 - 它只是为您提供3个可能的用户选项是x

您正在尝试评估@user.professional,但它无法正常工作。您需要使用以下(cancancan):

#Gemfile
gem "cancancan"

#app/models/ability.rb
class Ability
  include CanCan::Ability

  def initialize(user)
    user ||= User.new # guest user (not logged in)
    if user
      can :read, User do |user_eval|
         user_eval.profile_type == user.profile_type
      end 
    end
  end
end

#app/controllers/users_controller.rb
class UsersController < ApplicationController
   load_and_authorize_resource
end

#app/views/users/index.html.erb
<%= render @users %>

#app/views/users/show.html.erb
<%= render @user %>

#app/views/users/_user.html.erb
<% if can? :read, user %>
   ...
<% end %>

Good ref

答案 3 :(得分:0)

更新: 在user / show.html.erb上,我删除了以下内容,

<% if current_user.provider %>
......
<% if current_user.professional %>
......
<% if current_user.seeker %>
......

并替换为,

<% if @user.provider %>
......
<% elsif @user.professional %>
......
<% elsif @user.seeker %>
......

应用程序正是我现在想要的功能。 有没有人看到这个问题? 除了重复代码,我将整理一些偏见。 谢谢你的耐心,我是rails的新手。