Ruby on Rails Thursday, February 8, 2018

> On Feb 8, 2018, at 8:28 AM, fugee ohu <fugee279@gmail.com> wrote:
>
> I was having trouble hiding and showing elements on the form so I created a separate action in the pictures controller to handle the submission of the form that selects pictures to add to the person from existing pictures in the database It attempts to create a new picture I guess because validation fails :name cannot be blank
>
> def add_from_pictures_create
> if (params[:picture][:person_id])
> @person=Person.find(params[:picture][:person_id])
> @pictures = Picture.find(params[:person][:picture_ids])

# these are now new instances -- with different object IDs -- than the ones you want to compare them with

> @person.pictures << @pictures

# assigning these in this way means that you are adding an array to an array. Trouble is, you are adding duplicate instances in the second array to an array which may already contain the ones you want to add.

> respond_to do |format|
> if @person.save
> format.html { redirect_to pictures_path(person_id: params[:picture][:person_id]), notice: 'Person picture updated.' }
> format.json { render :show, status: :created, location: @picture }

I would avoid this entire approach. Think about this in the abstract: you are editing and updating the @person, manipulating the picture_ids attribute on that instance. Your form is built on the person. This form should be submitted to the PersonController#update method. If you have (as I have said many times in this thread) whitelisted the picture_ids attribute, then simply calling @person.save will persist that attribute -- it is already going to be in the person_params strong parameters hash.

Here's a clue: when you find yourself writing something like this in a controller:

> @person=Person.find(params[:picture][:person_id])

...just walk away and have a think about your life.

Walter

--
You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group.
To unsubscribe from this group and stop receiving emails from it, send an email to rubyonrails-talk+unsubscribe@googlegroups.com.
To post to this group, send email to rubyonrails-talk@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/rubyonrails-talk/6319F830-3E44-455C-AD7E-F1924DFB36EE%40wdstudio.com.
For more options, visit https://groups.google.com/d/optout.

No comments:

Post a Comment