On Dec 6, 2012, at 9:11 AM, Colin Law wrote:
> On 6 December 2012 13:43, Jean-David <[email protected]> wrote:
>>
>> Le jeudi 6 décembre 2012 13:23:58 UTC+1, Colin Law a écrit :
>>> On 6 December 2012 12:11, Jean-David <[email protected]> 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
>
>>
>> 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 [email protected].
> To unsubscribe from this group, send email to
> [email protected].
> 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 [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit https://groups.google.com/groups/opt_out.