2016-07-28 35 views
0

用户“管理员”创建事件。所以每个事件都有自己的URL,如“events/1”。在公共场所(即不需要认证)。一位公众可以购买该活动的门票。所有管理员要做的事情是发布公共URL,即“事件/ 1”,并为购票者填写表格无法使关联起作用

我无法让ticket_buyer与其各自的事件相关联(即事件/ 1)。这里是在命令提示运行Event.first.ticket_buyers的结果示出没有在阵列中,即使我已经填充了使用的应用形式(不是命令API)ticket_buyer数据的第一个事件:

irb(main):001:0> Event.first.ticket_buyers 
    Event Load (0.0ms) SELECT "events".* FROM "events" ORDER BY "events"."id" ASC LIMIT 1 
    TicketBuyer Load (1.0ms) SELECT "ticket_buyers".* FROM "ticket_buyers" WHERE "ticket_buyers"."event_id" = ? [["event_id", 1]] 
=> #<ActiveRecord::Associations::CollectionProxy []> 

事件模型

class Event < ActiveRecord::Base 
    belongs_to :admin 
    has_many :ticket_buyers, dependent: :destroy 
end 

TicketBuyer型号

class TicketBuyer < ActiveRecord::Base 
    belongs_to :event 
end 

活动控制器

class EventsController < ApplicationController 
    before_filter :authenticate_admin!, :except => :show 

    def index 
    @events = current_admin.events 
    end 

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

    def new 
    @event = current_admin.events.build 
    @event.admin = current_admin 
    end 

    def create 
    @event = current_admin.events.build(event_params) 

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

    private 

    def event_params 
     params.require(:event).permit(:name_of_event, ticket_buyer_attributes: [:full_name, :number_of_tickets]) 
    end 
end 

购票者控制器

class TicketBuyersController < ApplicationController 
    before_action :authenticate_admin!, :except => [:new, :create] 

    def index 
    @ticket_buyer = TicketBuyer.all 
    end 

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

    def new 
    @ticket_buyer = TicketBuyer.new 
    end 

    def create 
    @ticket_buyer = TicketBuyer.new(ticket_buyer_params) 
    if @ticket_buyer.save 
     redirect_to localhost:3000 
    else 
     render('new') 
    end 
    end 

    private 

    def set_ticket_buyer 
    @ticket_buyer = Ticket_buyer.find(params[:id]) 
    end 

    def ticket_buyer_params 
    params.require(:ticket_buyer).permit(:full_name, :number_of_tickets) 
    end 
end 

数据库模式

ActiveRecord::Schema.define(version: 20160705212350) do 

    create_table "admins", force: :cascade do |t| 
    t.string "email",     default: "", null: false 
    t.string "encrypted_password",  default: "", null: false 
    t.string "reset_password_token" 
    t.datetime "reset_password_sent_at" 
    t.datetime "remember_created_at" 
    t.integer "sign_in_count",   default: 0, null: false 
    t.datetime "current_sign_in_at" 
    t.datetime "last_sign_in_at" 
    t.string "current_sign_in_ip" 
    t.string "last_sign_in_ip" 
    t.datetime "created_at",       null: false 
    t.datetime "updated_at",       null: false 
    t.string "full_name" 
    end 

    add_index "admins", ["email"], name: "index_admins_on_email", unique: true 
    add_index "admins", ["reset_password_token"], name: "index_admins_on_reset_password_token", unique: true 

    create_table "events", force: :cascade do |t| 
    t.text  "name_of_event" 
    t.integer "admin_id" 
    t.datetime "created_at",   null: false 
    t.datetime "updated_at",   null: false 
    end 

    add_index "events", ["admin_id"], name: "index_events_on_admin_id" 

    create_table "ticket_buyers", force: :cascade do |t| 
    t.text  "full_name" 
    t.integer "event_id" 
    t.datetime "created_at",   null: false 
    t.datetime "updated_at",   null: false 
    end 

    add_index "ticket_buyers", ["event_id"], name: "index_ticket_buyers_on_event_id" 
end 

的routes.rb

Rails.application.routes.draw do 
    devise_for :admins 
    resources :events do 
     resources :ticket_buyers do 
    end 
end 

ticket_buyers/index.html.erb

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

    <table class='table table-striped table-hover'> 
    <thead> 
     <tr> 
     <th>Name</th> 
     <th>Number of tickets</th> 
     <th colspan="4"></th> 
     </tr> 
    </thead> 

    <tbody> 
     <% @ticket_buyer.each do |ticket_buyer| %> 
     <tr class="<%= cycle('list_line_odd', 'list_line_even') %>"> 
     <tr> 
      <td><%= link_to ticket_buyer.full_name %></td> 
      <td><%= link_to ticket_buyer.number_of_tickets %></td>   
     </tr> 
    <% end %> 
    </tbody> 
    </table> 
<%= link_to 'Back', events_path %> 
+0

我让你在你的UPDATE建议的修改,我在本地主机得到了以下错误:3000 /事件/ EVENT_ID/ticket_buyers: – Tkendall

回答

0

在你TicketBuyer创建行动,你需要记录与创建之后的事件相关联:

class TicketBuyersController < ApplicationController 
    before_action :authenticate_admin!, :except => [:new, :create] 

    def create 
    @ticket_buyer = TicketBuyer.new(ticket_buyer_params) 

    if @ticket_buyer.save 
     # This line below links it to your event 
     Event.find(params[:event_id]).ticket_buyers << @ticket_buyer 
     redirect_to localhost:3000 
    else 
     render('new') 
    end 
    end 

你也可以使用事件本身创建ticket_buyer,如下所示:

def create 
    @ticket_buyer = Event.find(params[:event_id]).ticket_buyers.new(ticket_buyer_params) 

    if @ticket_buyer.save 
    redirect_to localhost:3000 
    else 
    render('new') 
    end 

这会在构建模型时自动将正确的event_id添加到模型中。另外,确保您已经运行了将event_id列添加到ticket_buyers表的迁移。

UPDATE:

要显示的指标动作正确ticket_buyers,你需要自行加载事件,然后使用可以循环通过相关ticket_buyers对于该事件:

TicketBuyersController:

def index 
    @event = Event.find(params[:event_id]) 
end 

索引视图:

<tbody> 
    <% @event.ticket_buyers.each do |ticket_buyer| %> 
    <tr class="<%= cycle('list_line_odd', 'list_line_even') %>"> 
    <tr> 
     <td><%= link_to ticket_buyer.full_name %></td> 
     <td><%= link_to ticket_buyer.number_of_tickets %></td>   
    </tr> 
<% end %> 
+0

谢谢您。我在控制台中的Event.first.ticket_buyer查询结果现在显示第一个事件的正确票据买家。但是,我的views/ticket_buyers/index.html.erb仍显示所有ticket_buyer,即使是其他事件。我尝试了各种变化,但没有任何接缝可以工作。你可以看看上面张贴的模板文件,并让我知道你是否有任何建议?再次感谢。 – Tkendall

+0

我已更新我的答案,只显示该活动ticket_buyers。如果该作品请将答案标记为已接受。谢谢。 – RichardAE

+0

我对更新建议的索引视图进行了更改,当我到localhost3000/events/event_id/ticket_buyers时出现以下错误: – Tkendall

0

这是因为您没有针对ticket_buyer记录保存事件ID。我想知道为什么你还没有验证ticket_buyer的存在。 一个直接快速的解决办法是你的事项标识添加到您的ticket_buyer_params像这样:

def ticket_buyer_params 
    params.require(:ticket_buyer).permit(:full_name, :number_of_tickets, :event_id) 
end 
+0

他有嵌套的路由,所以event_id在邮件路由本身传递,它不需要在表单中传递。 – RichardAE