Рельсы, полиморфные ассоциации и помощники форм - PullRequest
0 голосов
/ 11 октября 2018

Почему-то я не могу использовать полиморфную ассоциацию и вложенные формы.Вот мои User, Company и Subscription модели:

#app/models/user.rb
class User < ApplicationRecord
    has_many subscriptions, dependent: :destroy, as: :imageable
end

.

#app/models/company.rb
class Company < ApplicationRecord
    has_many :subscriptions, dependent: :destroy, as: :imageable
end

.

#app/models/subscription.rb
class Subscription < ApplicationRecord
    belongs_to :imageable, polymorphic: true
end

и вот чтоУ меня в контроллере Company:

def company_params
  params.require(:company).permit(:full_name, :subscriptions_attributes => {})
end

Когда я пытаюсь отправить форму с выбранной вложенной подпиской, я получаю сообщение об ошибке:

Processing by ComaniesController#create as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"daP0snbHyLNm4KlzoO3YnkBrU/pD6ksUuOFp4icB74h0Uf929UT+4TAMxbuTBCwu5w+HWH3zD0gP3TwXcAmrHQ==", "company"=>{"full_name"=>"Test", "subscriptions_attributes"=>{"0"=>{"name"=>"", "start_date"=>"", "stop_date"=>""}}}}
  User Load (0.5ms)  SELECT  `users`.* FROM `users` WHERE `users`.`id` = 1 ORDER BY `users`.`id` ASC LIMIT 1
   (0.4ms)  BEGIN
Completed 500 Internal Server Error in 89ms (ActiveRecord: 6.4ms)

, но еслиЯ иду к консоли рельсов, могу успешно набрать Company.subscriptions.create(name: "Random")

Что я делаю не так?До того, как я реализовал полиморфные ассоциации, все работало нормально, но сейчас я не могу этого понять.

РЕДАКТИРОВАТЬ

При дальнейшем исследовании кажется, что причина этогоне удается из-за того, что подписка компании не содержит целое число для imageable_id

В моем контроллере Company у меня есть следующее:

  # GET /companies/new
  def new
    @company = Company.new
    @company.subscriptions.build
  end

и при проверке @company.Я вижу, что для imageable_type уже задано значение "Компания", но imageable_id равно нулю и никогда не заполняется.

Где именно это должно быть заполнено?

РЕДАКТИРОВАТЬ

Вот форма:

<%= form_with(model: @company, local: true) do |form| %>
...
    <tbody>
        <%= form.fields_for :subscriptions do |subscription| %>
        <tr>
            <td><%= subscription.text_field :name, :subscription_name, class: "form-control" %></td>
            <td><%= subscription.date_field :start_date, as: :date, value: subscription.object.try(:strftime,"%m/%d/%Y"), class: 'form-control' %></td>
            <td><%= subscription.date_field :stop_date, as: :date, value: subscription.object.try(:strftime,"%m/%d/%Y"), class: 'form-control' %></td>
            <td><%= link_to "<i class='fas fa-trash'></i>".html_safe, '#', class: "btn btn-xs btn-danger delete_row" %></td>
        </tr>
        <% end %>
    </tbody>
...
<% end %>

1 Ответ

0 голосов
/ 11 октября 2018

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

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