2016-07-28 5 views
0

Пользователи «администраторов» создают события. Поэтому каждое событие имеет свой собственный URL-адрес, например «events/1». На общедоступном сайте (т. Е. Не требуется аутентификация). Член общественности может купить билеты на мероприятие. Все, что нужно администратору, это опубликовать общедоступный URL-адрес, т. Е. «Event/1», и он дает форму для покупателя, который должен заполнить заявку.Не удается получить ассоциации для работы

Я не могу заставить Ticket_buyers быть связанными с их соответствующим событием (т.е. событие/1). Вот результат выполнения Event.first.ticket_buyers в командной строке, которая ничего не показывает в массиве, даже если я заселена первое событие с данными ticket_buyer с помощью формы приложения (не команда API):

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 []> 

Event модель

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 

You может также создать 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 в консоли теперь показывают правильного покупателя билетов для первого события. Тем не менее, мои взгляды/ticket_buyers/index.html.erb все еще показывают все ticket_buyers, даже для других событий. Я пробовал разные изменения, но ничего не работает. Можете ли вы просмотреть этот файл шаблонов, опубликованный выше, и сообщить мне, есть ли у вас какие-либо предложения? Еще раз спасибо. – Tkendall

+0

Я обновил свой ответ, чтобы показать только события ticket_buyers. Если это работает, отметьте ответ как принятый. Благодарю. – RichardAE

+0

Я внес изменения в индексное представление, которое вы рекомендовали в своем обновлении, и я получил следующую ошибку, когда я перешел на localhost3000/events/event_id/ticket_buyers: – Tkendall

0

Это связано с тем, что вы не сохраняете идентификатор события в записи ticket_buyer.Интересно, почему вы также не проверяете наличие ticket_buyers. Непосредственным быстро исправить, чтобы добавить event_id к вашему ticket_buyer_params так:

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

У него есть вложенные маршруты, поэтому event_id передается в самом почтовом маршруте, его не нужно передавать в форме. – RichardAE

Смежные вопросы