Как привязать подписчика к событию

Я пытаюсь сделать это подписчиком, подписаться на определенное событие со следующим 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

Может быть, есть способ получше, но почему бы не использовать скрытое поле в форме, получая требуемый параметр из URL-адреса?

iGian 02.05.2018 11:18

вы установили модельные ассоциации?

Gagan Gupta 02.05.2018 11:24

@GaganGupta Да, послушайте, я отредактировал вопрос.

Arb 02.05.2018 11:28

хорошо. Связи моделей настроены довольно хорошо, но есть проблема с методами контроллера. Итак, где бы вы ни установили @event.Subscriber.new, измените его на @event.subscriber.new

Gagan Gupta 02.05.2018 11:31

а также. Сделайте это @event = Event.find(params[:event_id])

Gagan Gupta 02.05.2018 11:32

@GaganGupta Я его изменил, и все та же ошибка: /

Arb 02.05.2018 11:38

Можете ли вы также поделиться созданием маршрутов?

Gagan Gupta 02.05.2018 12:47

@GaganGupta, что вы имеете в виду под генерацией маршрутов?

Arb 02.05.2018 14:50

Позвольте нам продолжить обсуждение в чате.

Gagan Gupta 02.05.2018 15:27
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
9
74
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Думаю, у вас просто опечатка в методе 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

Сообщайте мне, помогает ли это и есть ли у вас какие-либо дополнительные проблемы

При этом в следующей строке (@subscriber = @ event.subscriber.new) появляется сообщение об ошибке: undefined method `subscriber 'для # <Event: 0x00007f885358f8f8> Вы имели в виду? подписчики подписчики =

Arb 02.05.2018 11:41

Да, вы правы, но если вы посмотрите мой код, то увидите, что я написал не subscriber, а subscriberS. Просто скопируйте это правильно

AntonTkachov 02.05.2018 11:42

Если это поможет, я искренне прошу вас отметить мой ответ галочкой и проголосовать за будущие запросы других людей. Заранее спасибо :)

AntonTkachov 02.05.2018 11:44

После добавления S я получаю сообщение об ошибке: неизвестный атрибут event_id для подписчика.

Arb 02.05.2018 11:48

Вставьте, пожалуйста, миграцию, которая использовалась для создания таблицы подписок

AntonTkachov 02.05.2018 11:49

Необходимо добавить миграцию и использовать build вместо new

Alexander Sysuiev 02.05.2018 11:50

@AlexanderSysuiev Да, вы правы. Обновление моего ответа

AntonTkachov 02.05.2018 11:51

@AlexanderSysuiev - это миграция, которая использовалась для создания таблицы подписчиков: class CreateSubscribers <ActiveRecord :: Migration [5.1] def change create_table: подписчики do | t | t.belongs_to: событие, foreign_key: true t.string: name t.string: email t.timestamps end end end

Arb 02.05.2018 12:06

Проверьте свою таблицу subscribers. Похоже, у вас есть поле Event_id, тогда как оно должно быть event_id. Фактически ... просто проверьте все поля, которые у вас есть в вашем событии, и вставьте его сюда

AntonTkachov 02.05.2018 12:13

@AntonTkachov Да, вы правы, это Event_id, чтобы его изменить, мне нужно сделать новую миграцию или просто изменить его в schema.rb?

Arb 02.05.2018 12:59
schema.rb - это просто информационный файл. Вы можете изменить его любым способом, но никаких реальных изменений в db это не внесет. Да, перейти на новую миграцию - rails g rename_Event_id_to_event_id_in_subscriptions
AntonTkachov 02.05.2018 13:12

@AntonTkachov Я делаю это во время миграции: rename_column: subscriber,: Event_id,: event_id, но получаю эту ошибку: SQLite3 :: SQLException: повторяющееся имя столбца: event_id: ALTER TABLE "подписчики" ADD "event_id" целое число

Arb 02.05.2018 13:27

@Arb Странно ... у вас есть данные в вашей модели подписчиков или они пустые? В свой ответ добавлена ​​миграция, которую я бы использовал в таком случае. Но он деструктивен и должен использоваться только в том случае, если у вас нет реальных данных в Subscriber.

AntonTkachov 02.05.2018 13:31
Ответ принят как подходящий

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

Если вкратце, то сначала нужно поменять модели. У вас может быть много ко многим для ассоциации «Событие -> подписчик» или один ко многим. Один ко многим проще всего показать, поэтому вам нужно добавить это в свою модель подписчика:

belongs_to :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

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

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

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

Event ids: [1]

Привет, спасибо, за ассоциацию модели. Я отредактировал их на вопрос после комментария Гагана, для новой миграции: что-то отсутствует, переменная t не определена, должен ли я это делать: change_table: subscribers do | t | перед ?

Arb 02.05.2018 11:55

Я думаю, что у подписчиков уже есть event_id, потому что я получаю эту ошибку при попытке перенести: повторяющееся имя столбца: event_id: ALTER TABLE "подписчики" ADD "event_id" integer / Users / abderrahmane / workspace / Eventmanager / db / migrate / 201805‌ 02095034_addevent_id

Arb 02.05.2018 12:05

Таким образом, он у вас в базе данных, и вам не нужна дополнительная миграция. Было бы здорово, если бы вы на всякий случай выставили эту часть schema.rb. Можете ли вы показать текущую ошибку с помощью трассировки?

Alexander Sysuiev 02.05.2018 12:45

Кстати, если вы получили «неизвестный атрибут 'event_id' для подписчика», возможно, вы не запускали миграцию для этой среды. Поэтому, если вы получаете эту ошибку в тестах, сделайте: RAILS_ENV=test rake db:migrate

Alexander Sysuiev 02.05.2018 12:48

Я думаю, как сказал Антон, у меня Event_id, а не event_id, вот мой shema.rb для подписчиков: create_table "subscribers", force:: cascade do | t | t.integer "Event_id" t.string "name" t.string "email" t.datetime "created_at", null: false t.datetime "updated_at", null: false t.integer "events_id" t.index ["Event_id "], имя:" index_subscribers_on_Event_id "t.index [" events_id "], name:" index_subscribers_on_events_id "конец

Arb 02.05.2018 13:17

Изменена миграция для создания правильной структуры базы данных. Пожалуйста, дайте мне знать о любых проблемах

Alexander Sysuiev 02.05.2018 14:59

Позвольте нам продолжить обсуждение в чате.

Arb 02.05.2018 15:51

Другие вопросы по теме