Мои модели:метод Лучшая практика - создание 2 записей в 1 form_for
brand.rb
has_many :products
has_many :votes
belongs_to :user
accepts_nested_attributes_for :products, :allow_destroy => true
product.rb
belongs_to :user
belongs_to :brand
vote.rb
belongs_to :brand
belongs_to :user
routes.rb
resources :brands do
resources :products
end
Моя цель: Создать 2 записей (продукт и голосования) на существующих Марка запись в 1 форме, на brand/show
странице.
Мое решение:
бренд/show.html.erb
<% form_for([@brand, @brand.send(:product).klass.new]) do |f| %>
<%= f.label :title %>
<%= f.text_field :title %>
<%= f.label :price %>
<%= f.text_field :price %>
<%= fields_for :votes, @brand.votes.new do |builder| %>
<%= builder.label :rating %>
<%= builder.text_field :rating %>
<% end %>
<%= f.submit %>
<% end %>
products_controller.rb
def create
if Brand.exists?(:id => params[:brand_id])
@review = Review.new(review_params)
@vote = Vote.new(votes_params)
@review.user_id = @vote.user_id = current_user.id
@review.brand_id = @vote.brands_id = params[:brand_id]
if @vote.valid? && @review.valid?
@vote.save
@review.save
redirect_to brands_path
else
flash[:errors][:vote] = @vote.errors
flash[:errors][:review] = @review.errors
redirect_to brands_path
end
end
end
private
def product_params
params.require(:review).permit(:title, :price)
end
def votes_params
params.require(:votes).permit(:rating)
end
Является ли это правильный путь решения моей задачи? Могу ли я использовать его так?
Выглядит очень здорово! Но я не пишу 'f.fields_for', потому что я не хочу касаться уже созданной записи« brand », чтобы избежать повторной аттестации и т. Д. И о build_product, я получаю' undefined method 'build_reviews''. Может быть, я должен сделать что-то вроде '@ brand.products.build' в моем контроллере? – Src
, если вам нужны объяснения, не стесняйтесь, многое изменилось в этом предлагаемом рефакторе, и вы не можете получить причину, почему он изменился на это. – MrYoshiji
Кроме того, я использовал метод 'valid?' Для сохранения двух моделей или ничего не сохранять. – Src