【问题标题】:I'm not able to have just the admin's information display in index我不能只在索引中显示管理员的信息
【发布时间】:2016-06-02 23:56:28
【问题描述】:

使用 Ruby 2.2、Rails 4.2.5.1 和 Devise gem。我在安装 Devise 时将用户定义为管理员。每个管理员都可以创建一个事件。登录后,我希望管理员只看到他们创建的事件列表。此时,所有管理员创建的所有事件都显示出来了。在尝试了我的搜索中提供的许多解决方案后,我继续遇到各种错误,因此我已将代码恢复到正常工作状态,但是,我再次显示所有事件。我正在考虑安装 CanCanCan,因为我了解它的能力功能可能会有所帮助,但这是一种常见的需求,我觉得必须有一个我缺少的简单方法。非常感激任何的帮助。下面是事件控制器、事件视图 index.html.erb、事件模型和管理模型,以及 routes.rb 代码。

events_controller.rb:

class EventsController < ApplicationController

def index
   @events = Event.all
end

def show
    @event = Event.find(params[:id])
end

def new
  @event = Event.new
end

def edit
  @event = Event.find(params[:id])
end

def create
  @event = Event.new(event_params)

  if @event.save
    redirect_to @event
  else
    render 'new'
  end
end

def update
  @event = Event.find(params[:id])

  if @event.update(event_params)
    redirect_to @event
  else
    render 'edit'
  end
end

def destroy
  @event = Event.find(params[:id])
  @event.destroy

  redirect_to events_path
end

private
  def event_params
    params.require(:event).permit(:name_of_event, :description_tag_line, :description, :date, :time, :location, :ticket_price)
  end
end

routes.rb:

Rails.application.routes.draw do

  devise_for :admins
    resources :events
      resources :ticket_buyers

  get 'pages/home'

  get 'pages/about'

  root 'home#index'

  match ':controller(/:action(/:id))', :via => [:get, :post]
end

模型事件.rb:

class Event < ActiveRecord::Base
    belongs_to :admin

    has_many :ticket_buyers, dependent: :destroy

    validates :name_of_event, presence: true, length: {maximum: 40}
    validates :description_tag_line, presence: true, length: {maximum: 100}
    validates :description, presence: true, length: {maximum: 300}
    validates :date, presence: true
    validates :time, presence: true
    validates :location, presence: true, length: {maximum: 40}
    validates :ticket_price, presence: true, length: {maximum: 5}
end

模型管理员.rb:

class Admin < ActiveRecord::Base
    has_many :events, dependent: :destroy

  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable
end

查看事件 index.html.erb:

<p id="notice"><%= notice %></p>

<h1>Events</h1>

<table>
  <thead>
      <tr>
          <th>Name of event</th>
          <th>Description tag line</th>
          <th>Description</th>
          <th>Date</th>
          <th>Time</th>
          <th>Location</th>
          <th>Ticket price</th>
        <th colspan="7"></th>
      </tr>
  </thead>
<tbody>
  <% @events.each do |event| %>
    <tr class="<%= cycle('list_line_odd', 'list_line_even') %>">
      <td><%= event.name_of_event %></td>
      <td><%= event.description_tag_line %></td>
      <td><%= event.description %></td>
      <td><%= event.date %></td>
      <td><%= event.time %></td>
      <td><%= event.location %></td>
      <td><%= event.ticket_price %></td>
      <td><%= link_to 'Show', event_path(event) %></td>
      <td><%= link_to 'Edit', edit_event_path(event) %></td>
      <td><%= link_to 'Delete', event_path(event),
              method: :delete,
              data: { confirm: 'Are you sure?' } %></td>

    </tr>
  <% end %>
</tbody>
</table>

<%= link_to 'New event', new_event_path %>

【问题讨论】:

  • 这是我的 schema.rb。我确实有一个 Admin_id。应该是 admin_id 而不是 Admin_id? create_table "events", 强制: :cascade do |t| t.string "title" t.text "text" t.datetime "created_at", null: false t.datetime "updated_at", null: false t.string "name_of_event" t.string "description_tag_line" t.string "description" t.date "date" t.time "time" t.string "location" t.decimal "ticket_price" t.integer "Admin_id" end add_index "events", ["Admin_id"], name: "index_events_on_Admin_id"
  • 由于某种原因,我无法添加代码向您展示。 ctrl K 没有缩进它,通常它说我有太多字符。我应该用新代码开始一个新问题吗?我想展示新的事件控制器 event/index.html.erb、event/new.html.erb、我的 event_form.html.erb 和我的 schema.rb。
  • 我按照您的建议进行了所有更改。我收到错误消息:EventsController#new 中的 ActionController::ParameterMissing。新的 def 是: def new @event = Event.new(event_params, admin: current_admin)

标签: ruby-on-rails devise


【解决方案1】:

您似乎根本没有使用 devise 来验证管理员身份(例如,在 EventsController 中添加 before_action :authenticate_admin!)。

一旦你这样做了,你就可以使用current_admin作为当前经过身份验证的管理员,然后你需要在index查询中使用它 -

def index
    @events = Event.where(admin: current_admin)
end

有关更多信息,请阅读设计文档 (https://github.com/plataformatec/devise)

【讨论】:

  • 谢谢。我之前尝试过,但现在它不会返回 events.html.erb 中的任何事件。我认为这可能是 行。是否需要修改以引用current_admin?我尝试了各种方法,但都没有奏效。
  • 对不起。我的意思是事件/index.html.erb。
  • 当你create一个事件时,你也应该初始化admin属性。例如@event = Event.new(event_params, admin: current_admin)。此外 - 您需要在控制器的几乎所有功能中引用 current_admin - 以验证一个人只能访问/创建/更新他自己的事件。
  • 谢谢。我更改了 events/index.html.erb 中的所有控制器以包含 current_admin 操作。我仍然没有任何活动可以展示。保存更改后,我创建了一些新的。我在日志中注意到的一件事是我认为管理员显示为零。这是我日志中的一个片段:
  • 在 2016-06-03 08:45:12 -0500 开始 GET "/events" for ::1 由 EventsController#index 作为 HTML 管理员负载处理 (0.5ms) SELECT "admins".* FROM "admins" WHERE "admins"."id" = ? ORDER BY "admins"."id" ASC LIMIT 1 [["id", 1]] 事件负载 (0.0ms) SELECT "events".* FROM "events" WHERE "events"."admin_id" = ? [[nil, 1]] 在布局/应用程序中渲染事件/index.html.erb (3.0ms) 渲染布局/_footer.html.erb (0.0ms) 在 193ms 内完成 200 OK (Views: 185.9ms | ActiveRecord: 0.5ms )
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-20
  • 1970-01-01
  • 2012-04-21
  • 2020-01-10
  • 1970-01-01
  • 1970-01-01
  • 2013-09-10
相关资源
最近更新 更多