我的应用有三种类型的配置文件:
我使用用户索引页面显示这些配置文件以查看所有配置文件。
我遇到的问题是我可以在索引页面上看到所有个人资料,但除非以该类型的个人资料登录,否则无法访问它们。
专业用户个人资料可以查看所有个人资料,但只能访问专业个人资料。
我该如何解决这个问题?我可以看到为什么我在用户中显示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>
答案 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 %>
答案 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的新手。