Ruby on Rails Thursday, December 6, 2012



Le jeudi 6 décembre 2012 17:14:47 UTC+1, Rob Biedenharn a écrit :

On Dec 6, 2012, at 9:11 AM, Colin Law wrote:
> On 6 December 2012 13:43, Jean-David <jeandav...@gmail.com> wrote:
>>
>> Le jeudi 6 décembre 2012 13:23:58 UTC+1, Colin Law a écrit :
>>> On 6 December 2012 12:11, Jean-David <jeandav...@gmail.com> wrote:
>>>> ...
>>>> Thanks for the advise. Logging led me to a solution, but I don't
>>>> really understand what's going on under the hood.
>>>>
>>>> Here's my solution:
>>>>
>>>> "upload" now returns this:
>>>>  return "#{uploaded_io.original_filename}"
>>>>
>>>> In "create", I set:
>>>>  @lead.illustration = upload
>>>>
>>>> In "update", this wont work. I need to set:
>>>>  params[:lead][:illustration] = upload
>>>> and the update goes fine.
>>>>
>>>> After finding this out I tried to set
>>>>  params[:lead][:illustration] = upload
>>>> instead of
>>>> @lead.illustration = upload
>>>> in "create", and that wont work.
>>>
>>> Can you post your create and update methods as you now have them so I
>>> can see what you are doing.
>>
>> Sure, here goes :
>>
>>  def create
>>    @lead = Lead.new( params[:lead] )
>>
>>    @lead.illustration = upload_image
>>
>>    if @lead.save
>>      flash[:success] = "Leaderboard successfully added."
>>      redirect_to @lead
>>    else
>>      redirect_to root_path
>>    end
>>  end
>>
>>  def update
>>    @lead = Lead.find_by_id( params[:id] )
>>
>>    params[:lead][:illustration] = upload_image
>
> You said that doing @lead.illustration = upload_image (presumably at
> this point) did not work.  It should do, provided that
> params[:lead][:illustration] is not present.  If it is then the value
> from upload_image will be overwritten by the value from params when
> you call  update_attributes.  Another possibility is that if the
> illustration is the only field being changed then update_attributes
> may not actually save the record (as it does not think anything has
> changed).
>
> Probably leaving it as you have it is the simplest solution.
>
> Colin

Jean-David,

Here's a bit of code from an old project of mine:

  def update
    data = params[:product].delete('data') # HashWithIndifferentAccess still needs the actual key type to .delete
    begin
      @product = Product.find(params[:id], :conditions => { :virtual => true })

      unless data.blank?          # i.e., not replacing image
        content = data.read
        if content.blank?
          flash[:error] = "Selected upload file was empty"
          redirect_to :action => 'edit'
          return
        end
        @product.image_size = ImageSizer.of_blob(content).size
        filename = Product.get_local_image_name data.original_filename
        File.open(File.join(RAILS_ROOT, 'public', filename), 'wb') do |f|
          f.write content
        end
        @product.image = filename
      end

      respond_to do |format|
        if @product.update_attributes(params[:product])

  end

Note that I am removing the 'data' key from the attributes hash params[:product] so that it isn't used in the .update_attributes call later. Perhaps you need to remove the 'illustration' since you've already handled that portion of the update.

If you know that the illustration is changed, but ActiveRecord doesn't, then perhaps you need to call @lead.illustration_will_change! to inform AR that the attribute is dirty and needs to be written out.

-Rob

Thank you Rob, I'll try to put that in my own sauce (that's an approximate translation for french "à ma sauce" ; )
 

>
>>
>>    if @lead.update_attributes( params[:lead] )
>>      flash[:success] = "Leaderboard successfully updated."
>>      redirect_to @lead
>>    else
>>      render action: "edit"
>>    end
>>  end
>>
>>
>>  def upload_image
>>    if params[:lead][:illustration]
>>      uploaded_io = params[:lead][:illustration]
>>
>>      File.open(Rails.root.join('app', 'assets', 'images',
>> uploaded_io.original_filename), 'wb') do |file|
>>        file.write(uploaded_io.read)
>>      end
>>
>>      return "#{uploaded_io.original_filename}"
>>    end
>>  end
>>
>>
>>
>>>
>>> Colin
>
> --
> You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group.
> To post to this group, send email to rubyonra...@googlegroups.com.
> To unsubscribe from this group, send email to rubyonrails-ta...@googlegroups.com.
> For more options, visit https://groups.google.com/groups/opt_out.
>
>

--
You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group.
To post to this group, send email to rubyonrails-talk@googlegroups.com.
To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msg/rubyonrails-talk/-/227ndv4VcqkJ.
For more options, visit https://groups.google.com/groups/opt_out.
 
 

No comments:

Post a Comment