Как связать подписчика с событием - PullRequest
0 голосов
/ 02 мая 2018

Я пытаюсь сделать это подписчиком, подчиненным определенному событию со следующим URL в каждом примере:

http://localhost:3001/events/1/subscribers/new

но я не знаю, как связать event_id при создании нового подписчика

на данный момент я получаю эту ошибку:

Couldn't find Event with 'id'=

в маршрутах:

 resources :events do
    resources :subscribers #url/events/:events_id/subscribers/new
  end

  resources :events
  root 'events#index'

в контроллере подписчиков:

def show
  end

  # GET /subscribers/new
  def new
    #puts "Look for me in console\n"
    #puts params.inspect
    @event = Event.find(params[:events_id])
    @subscriber = @event.Subscriber.new
  end

  # GET /subscribers/1/edit
  def edit
  end

  # POST /subscribers
  # POST /subscribers.json
  def create
    @event = Event.find(params[:order_id])
    @subscriber = @event.Subscriber.new order_params
    #@subscriber = Subscriber.new(subscriber_params)

    respond_to do |format|
      if @subscriber.save
        SubsMailer.new_subscriber(@subscriber).deliver
        format.html { redirect_to @subscriber, notice: 'Subscriber was successfully created.' }
        format.json { render :show, status: :created, location: @subscriber }
      else
        format.html { render :new }
        format.json { render json: @subscriber.errors, status: :unprocessable_entity }
      end
    end
  end

в new.html.erb:

<h1>New Subscriber</h1>

<%= render 'form', subscriber: @subscriber %>

<%= link_to 'Back', subscribers_path %>

модель ассоциации:

event.rb:

class Event < ApplicationRecord
  has_many :subscribers, dependent: :destroy
end

subscriber.rb:

class Subscriber < ApplicationRecord
  belongs_to :event
  validates :email, presence: true,
                    format: /\A\S+@\S+\z/,
                    uniqueness: { case_sensitive: false }
end

Ответы [ 2 ]

0 голосов
/ 02 мая 2018

Ну, я думаю, эта документация поможет вам понять, что вам нужно делать.

Если кратко, сначала вам нужно сменить модель. Вы можете иметь много ко многим для Event -> Subscriber Ассоциации или один ко многим. Показывать один-ко-многим проще всего, поэтому вам нужно добавить это к вашей модели подписчика:

belongs_to :event

А это для вашей модели Event:

has_many :subscribers

Добавить новую миграцию:

def change
  remove_column :subscribers, :events_id
  remove_column :subscribers, 'Event_id'
  add_column :subscribers, :event_id, :integer
end

Тогда в вашем контроллере вы должны изменить вызовы методов, так как Subscriber это класс, а не метод.

def new
  @event = Event.find(params[:event_id])
  @subscriber = @event.subscribers.build
end

И вы должны быть уверены, что в вашей базе данных есть Event с этим идентификатором. Чтобы проверить это, вы можете попробовать отладить код вашего контроллера:

def new
  puts "Event ids: " + Event.all.map(&:id).inspect
  @event = Event.find(params[:event_id])
  @subscriber = @event.subscribers.build
end

В ваших логах должно быть что-то вроде:

Event ids: [1]
0 голосов
/ 02 мая 2018

Я думаю, у вас просто опечатка в вашем new методе. Вы звоните params[:eventS_id], когда должно быть params[:event_id]. Также вы не правильно ссылаетесь на свою ассоциацию. должно быть event.subscribers.new:

def new
  #puts "Look for me in console\n"
  #puts params.inspect
  @event = Event.find(params[:event_id])
  @subscriber = @event.subscribers.build
end

Миграция:

def up
  change_table :subscribers do |t|
    t.remove :Event_id
    t.references :event
  end
end

def down
  change_table :subscribers do |t|
    t.remove :event_id
    t.add :Event_id, :integer
  end
end

Держите меня в курсе, помогает ли это, и если у вас есть какие-либо дополнительные проблемы

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...