Я пытаюсь сделать это подписчиком, подписаться на определенное событие со следующим 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
вы установили модельные ассоциации?
@GaganGupta Да, послушайте, я отредактировал вопрос.
хорошо. Связи моделей настроены довольно хорошо, но есть проблема с методами контроллера. Итак, где бы вы ни установили @event.Subscriber.new
, измените его на @event.subscriber.new
а также. Сделайте это @event = Event.find(params[:event_id])
@GaganGupta Я его изменил, и все та же ошибка: /
Можете ли вы также поделиться созданием маршрутов?
@GaganGupta, что вы имеете в виду под генерацией маршрутов?
Позвольте нам продолжить обсуждение в чате.
Думаю, у вас просто опечатка в методе 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> Вы имели в виду? подписчики подписчики =
Да, вы правы, но если вы посмотрите мой код, то увидите, что я написал не subscriber
, а subscriberS
. Просто скопируйте это правильно
Если это поможет, я искренне прошу вас отметить мой ответ галочкой и проголосовать за будущие запросы других людей. Заранее спасибо :)
После добавления S я получаю сообщение об ошибке: неизвестный атрибут event_id для подписчика.
Вставьте, пожалуйста, миграцию, которая использовалась для создания таблицы подписок
Необходимо добавить миграцию и использовать build
вместо new
@AlexanderSysuiev Да, вы правы. Обновление моего ответа
@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
Проверьте свою таблицу subscribers
. Похоже, у вас есть поле Event_id
, тогда как оно должно быть event_id
. Фактически ... просто проверьте все поля, которые у вас есть в вашем событии, и вставьте его сюда
@AntonTkachov Да, вы правы, это Event_id, чтобы его изменить, мне нужно сделать новую миграцию или просто изменить его в schema.rb?
schema.rb
- это просто информационный файл. Вы можете изменить его любым способом, но никаких реальных изменений в db это не внесет. Да, перейти на новую миграцию - rails g rename_Event_id_to_event_id_in_subscriptions
@AntonTkachov Я делаю это во время миграции: rename_column: subscriber,: Event_id,: event_id, но получаю эту ошибку: SQLite3 :: SQLException: повторяющееся имя столбца: event_id: ALTER TABLE "подписчики" ADD "event_id" целое число
@Arb Странно ... у вас есть данные в вашей модели подписчиков или они пустые? В свой ответ добавлена миграция, которую я бы использовал в таком случае. Но он деструктивен и должен использоваться только в том случае, если у вас нет реальных данных в Subscriber
.
Что ж, я думаю, этот документация поможет вам понять, что вам нужно делать.
Если вкратце, то сначала нужно поменять модели. У вас может быть много ко многим для ассоциации «Событие -> подписчик» или один ко многим. Один ко многим проще всего показать, поэтому вам нужно добавить это в свою модель подписчика:
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 | перед ?
Я думаю, что у подписчиков уже есть event_id, потому что я получаю эту ошибку при попытке перенести: повторяющееся имя столбца: event_id: ALTER TABLE "подписчики" ADD "event_id" integer / Users / abderrahmane / workspace / Eventmanager / db / migrate / 201805 02095034_addevent_id
Таким образом, он у вас в базе данных, и вам не нужна дополнительная миграция. Было бы здорово, если бы вы на всякий случай выставили эту часть schema.rb
. Можете ли вы показать текущую ошибку с помощью трассировки?
Кстати, если вы получили «неизвестный атрибут 'event_id' для подписчика», возможно, вы не запускали миграцию для этой среды. Поэтому, если вы получаете эту ошибку в тестах, сделайте: RAILS_ENV=test rake db:migrate
Я думаю, как сказал Антон, у меня 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 "конец
Изменена миграция для создания правильной структуры базы данных. Пожалуйста, дайте мне знать о любых проблемах
Позвольте нам продолжить обсуждение в чате.
Может быть, есть способ получше, но почему бы не использовать скрытое поле в форме, получая требуемый параметр из URL-адреса?