У меня есть 3 модели: User
, Profile
и Photo
.
Profile < ApplicationRecord
belongs_to :user
has_many :photos, through: :user
Photo < ApplicationRecord
belongs to :user
User < ApplicationRecord
has_one :profile
has_many :photos
Я хотел бы создать форму для @profile
, которая также отображает флажки для всех связанных фотографий.
Когда фотография проверена, я бы хотел, чтобы #featured_status
этой фотографии превратился в TRUE
. (в моей базе данных он имеет значение по умолчанию 1).
Класс Photo имеет эти методы
class Photo < ApplicationRecord
belongs_to :user
has_attached_file :image, styles: { medium: "300x300>", thumb: "100x100>" }, default_url: "/images/:style/missing.png"
validates_attachment_content_type :image, content_type: /\Aimage\/.*\z/
validates :image, :title, :description, presence: true
FEATURED_STATUS = { not_featured: 0, featured: 1 }
def featured?
self.featured_status == FEATURED_STATUS[:featured]
end
def not_featured?
self.featured_status == FEATURED_STATUS[:not_featured]
end
def myPhoto
ActionController::Base.helpers.image_tag("#{image.url(:thumb)}")
end
end
Как я могу построить эту форму?
Я пробовал разные варианты использования fields_for
, collection_check_boxes, check_boxes, и я не могу правильно зафиксировать информацию.
На данный момент это моя форма.
<%= simple_form_for @profile do |f| %>
<%= f.input :bio, input_html: { class: 'form-control'} %>
<section class="main">
<label>Featured Profile Photos</label>
<% @profile.photos.each do |photo| %>
<%= form_for ([@profile, photo]) do |f| %>
<%= f.check_box :featured_status, :checked => (true if photo.featured?) %>
<%= f.submit %>
<% end %>
<label><%= photo.myPhoto %></label>
<% end %>
</section>
<%= f.button :submit %>
Когда форма отображается, появляется несколько кнопок «обновить» — по одной для каждой фотографии. Я также не могу отправить изменения @profile.bio одновременно с обновлением Featured_status фотографии.
В идеале я хотел бы, чтобы каждая из этих кнопок обновления фотографий была скрыта, и была только одна кнопка отправки, которая обновляет биографию профиля: текст и отображает @profile.
В то же время, я бы хотел, чтобы photo.featured_status менял значение true/false, как только флажок был установлен. (Может быть, с помощью Javascript?)
Любые предложения действительно ценятся.
Photo has_one profile
? Фото уже является дочерним элементом профиля. На самом деле это не может быть и родительским, и дочерним. (ну, может быть, но вы увидите это позже, особенно для моделей комментариев, где комментарий может быть родителем другого комментария, но также и дочерним элементом комментария, но для этого нужна конкретная формулировка) - person Maxence   schedule 01.07.2018User
является таблицей соединений, а вы используете ассоциациюhas_many :through
. - person iGian   schedule 01.07.2018Appointments
являются дочерними элементами какPatients
, так иPhysicians
. В дизайне вашего приложения. одинPhoto
, вероятно, может принадлежатьProfile
иUser
, хотяUser
уже принадлежитProfile
.Users
иprofiles
не являются двумя отдельными объектами, как в руководстве, но уже связаны в вашем дизайне. Пожалуйста, объясните, что такое Пользователи и Профили, их различие, и мы постараемся рассказать вам о правильных отношениях. - person Maxence   schedule 01.07.2018class Photo has_one :profile, inverse_of :photo
? Я попытался удалить has_one и получил ошибку при вызовеphoto.profile
. Добавление опции inverse_of, казалось, облегчило ситуацию. - person Kim   schedule 01.07.2018Photo
должен чем-то владеть. Фотография — это то, что принадлежит профилю, пользователю, продукту, компании... Я не уверен, что оно должно принадлежать кому-либо из них. - person Maxence   schedule 01.07.2018