Для начала вы хотите использовать belongs_to
, а не has_one
.
class Report < ApplicationRecord
belongs_to :reporting_user, class_name: 'Author'
belongs_to :post
end
Это правильно помещает столбец внешнего ключа post_id
в reports
. Использование has_one
помещает столбец fk в posts
, который не будет работать.
Как правило, лучшим решением было бы создание отчетов во вложенном ресурсе :
# /config/routes.rb
resources :posts do
resources :reports, only: [:create]
end
# app/controller/reports_controller.rb
class ReportsController
before_action :set_post
# POST /posts/:post_id/reports
def create
@report = @post.reports.new(reporting_user: current_author)
if @report.save
flash[:notice] = 'Reported'
else
flash[:notice] = report.errors.full_messages.join('. ')
end
redirect_to @post
end
private
def set_post
@post = Post.find(params[:post_id])
end
end
Это позволяет упростить кнопку до:
= button_to "Report", post_reports_path(post), method: :post
Поскольку post_id
является частью пути, нам не нужно отправлять дополнительные параметры.
Если вы хотите разрешить пользователю передавать дополнительную информацию через форму в будущем, лучшим способом создания / обновления ресурсов с параметрами и данными сеанса является передача блока:
@report = @post.reports.new(report_params) do |r|
r.reporting_user = current_user
end