【发布时间】: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