I am stuck and I donβt know why it is not working properly. I have a model product that has a lot of tags. When I update the product rails, I update the product attributes correctly, but create another tag entry instead of just updating it.
here is my code:
View Form:
<%= form_for ([@product.user, @product]), id: 'edit_form' do |f| %> <%= render 'shared/error_messages', object: f.object %> <div class="field"> <%= f.label :name %><br> <%= f.text_field :name %> </div> <div class="field"> <%= f.label :description %><br> <%= f.text_area :description %> </div> <div class="field"> <%= f.fields_for :tags do |t| %> <%= t.label :name %> <%= t.text_field :name %> <% end %> </div> <div class="actions"> <%= f.submit %> </div> <% end %>
product model:
class Product < ActiveRecord::Base belongs_to :user, :foreign_key => "user_id" has_many :tags, :dependent => :destroy accepts_nested_attributes_for :tags, reject_if: :all_blank, allow_destroy: true, :update_only => true end
Tag model
:
class Tag < ActiveRecord::Base belongs_to :product, :foreign_key => "product_id" # before_save { name.downcase! } end
product controller:
def edit user = User.find(params[:user_id]) @product = user.products.find(params[:id]) @tags = @product.tags.all respond_to do |format| format.html format.js end end def update user = User.find(params[:user_id]) @product = user.products.find(params[:id]) @tags = @product.tags.all respond_to do |format| if @product.update(product_params) format.html { redirect_to([@product.user, @product], :notice => 'Product successfully updated.') } else format.html { render :action => "edit" } end end end def product_params params.require(:product).permit(:name, :description, tags_attributes: :name) end
Thank you very much
source share