Could someone please help me debug this error I get when trying to submit a file upload in rails?
NoMethodError in NationsController#create
undefined method `encoding' for #<ActionDispatch::Http::UploadedFile:0x2d475c8>
Environment:
Windows 7 (64bit)
ruby -v =
ruby 2.0.0p353 (2013-11-22) [i386-mingw32]
rails -v =
DL is deprecated, please use Fiddle
Rails 4.1.1
Files:
nations/new.erb:
<%= form_for :nation, url: nations_path do |f| %>
...
<p>
<%= f.label :Upload_flag %>
<%= f.file_field :flag %>
</p>
<p>
<%= f.submit :Post %>
</p>
<% end %>
nations_controller.rb:
def create
@nation = Nation.new(nation_params)
if @nation.save
redirect_to @nation
else
render 'new'
end
private
def nation_params
params.require(:nation).permit(:name, :ruler, :government, :description, :flag)
end
end
The code line that is highlighted as containing the error is:
@nation = Nation.new(nation_params)
Full trace and request:
activerecord (4.1.1) lib/active_record/connection_adapters/sqlite3_adapter.rb:47:in `binary_to_string'
activerecord (4.1.1) lib/active_record/connection_adapters/column.rb:105:in `type_cast'
activerecord (4.1.1) lib/active_record/attribute_methods/dirty.rb:102:in `_field_changed?'
activerecord (4.1.1) lib/active_record/attribute_methods/dirty.rb:78:in `save_changed_attribute'
activerecord (4.1.1) lib/active_record/attribute_methods/dirty.rb:66:in `write_attribute'
activerecord (4.1.1) lib/active_record/attribute_methods.rb:47:in `__temp__66c61676'
activerecord (4.1.1) lib/active_record/attribute_assignment.rb:45:in `public_send'
activerecord (4.1.1) lib/active_record/attribute_assignment.rb:45:in `_assign_attribute'
activerecord (4.1.1) lib/active_record/attribute_assignment.rb:32:in `block in assign_attributes'
activerecord (4.1.1) lib/active_record/attribute_assignment.rb:26:in `each'
activerecord (4.1.1) lib/active_record/attribute_assignment.rb:26:in `assign_attributes'
activerecord (4.1.1) lib/active_record/core.rb:452:in `init_attributes'
activerecord (4.1.1) lib/active_record/core.rb:198:in `initialize'
activerecord (4.1.1) lib/active_record/inheritance.rb:30:in `new'
activerecord (4.1.1) lib/active_record/inheritance.rb:30:in `new'
app/controllers/nations_controller.rb:21:in `create'
actionpack (4.1.1) lib/action_controller/metal/implicit_render.rb:4:in `send_action'
actionpack (4.1.1) lib/abstract_controller/base.rb:189:in `process_action'
actionpack (4.1.1) lib/action_controller/metal/rendering.rb:10:in `process_action'
actionpack (4.1.1) lib/abstract_controller/callbacks.rb:20:in `block in process_action'
activesupport (4.1.1) lib/active_support/callbacks.rb:113:in `call'
activesupport (4.1.1) lib/active_support/callbacks.rb:113:in `call'
activesupport (4.1.1) lib/active_support/callbacks.rb:229:in `block in halting'
activesupport (4.1.1) lib/active_support/callbacks.rb:229:in `call'
activesupport (4.1.1) lib/active_support/callbacks.rb:229:in `block in halting'
activesupport (4.1.1) lib/active_support/callbacks.rb:166:in `call'
activesupport (4.1.1) lib/active_support/callbacks.rb:166:in `block in halting'
activesupport (4.1.1) lib/active_support/callbacks.rb:166:in `call'
activesupport (4.1.1) lib/active_support/callbacks.rb:166:in `block in halting'
activesupport (4.1.1) lib/active_support/callbacks.rb:166:in `call'
activesupport (4.1.1) lib/active_support/callbacks.rb:166:in `block in halting'
activesupport (4.1.1) lib/active_support/callbacks.rb:86:in `call'
activesupport (4.1.1) lib/active_support/callbacks.rb:86:in `run_callbacks'
actionpack (4.1.1) lib/abstract_controller/callbacks.rb:19:in `process_action'
actionpack (4.1.1) lib/action_controller/metal/rescue.rb:29:in `process_action'
actionpack (4.1.1) lib/action_controller/metal/instrumentation.rb:31:in `block in process_action'
activesupport (4.1.1) lib/active_support/notifications.rb:159:in `block in instrument'
activesupport (4.1.1) lib/active_support/notifications/instrumenter.rb:20:in `instrument'
activesupport (4.1.1) lib/active_support/notifications.rb:159:in `instrument'
actionpack (4.1.1) lib/action_controller/metal/instrumentation.rb:30:in `process_action'
actionpack (4.1.1) lib/action_controller/metal/params_wrapper.rb:250:in `process_action'
activerecord (4.1.1) lib/active_record/railties/controller_runtime.rb:18:in `process_action'
actionpack (4.1.1) lib/abstract_controller/base.rb:136:in `process'
actionview (4.1.1) lib/action_view/rendering.rb:30:in `process'
actionpack (4.1.1) lib/action_controller/metal.rb:195:in `dispatch'
actionpack (4.1.1) lib/action_controller/metal/rack_delegation.rb:13:in `dispatch'
actionpack (4.1.1) lib/action_controller/metal.rb:231:in `block in action'
actionpack (4.1.1) lib/action_dispatch/routing/route_set.rb:80:in `call'
actionpack (4.1.1) lib/action_dispatch/routing/route_set.rb:80:in `dispatch'
actionpack (4.1.1) lib/action_dispatch/routing/route_set.rb:48:in `call'
actionpack (4.1.1) lib/action_dispatch/journey/router.rb:71:in `block in call'
actionpack (4.1.1) lib/action_dispatch/journey/router.rb:59:in `each'
actionpack (4.1.1) lib/action_dispatch/journey/router.rb:59:in `call'
actionpack (4.1.1) lib/action_dispatch/routing/route_set.rb:676:in `call'
rack (1.5.2) lib/rack/etag.rb:23:in `call'
rack (1.5.2) lib/rack/conditionalget.rb:35:in `call'
rack (1.5.2) lib/rack/head.rb:11:in `call'
actionpack (4.1.1) lib/action_dispatch/middleware/params_parser.rb:27:in `call'
actionpack (4.1.1) lib/action_dispatch/middleware/flash.rb:254:in `call'
rack (1.5.2) lib/rack/session/abstract/id.rb:225:in `context'
rack (1.5.2) lib/rack/session/abstract/id.rb:220:in `call'
actionpack (4.1.1) lib/action_dispatch/middleware/cookies.rb:560:in `call'
activerecord (4.1.1) lib/active_record/query_cache.rb:36:in `call'
activerecord (4.1.1) lib/active_record/connection_adapters/abstract/connection_pool.rb:621:in `call'
activerecord (4.1.1) lib/active_record/migration.rb:380:in `call'
actionpack (4.1.1) lib/action_dispatch/middleware/callbacks.rb:29:in `block in call'
activesupport (4.1.1) lib/active_support/callbacks.rb:82:in `run_callbacks'
actionpack (4.1.1) lib/action_dispatch/middleware/callbacks.rb:27:in `call'
actionpack (4.1.1) lib/action_dispatch/middleware/reloader.rb:73:in `call'
actionpack (4.1.1) lib/action_dispatch/middleware/remote_ip.rb:76:in `call'
actionpack (4.1.1) lib/action_dispatch/middleware/debug_exceptions.rb:17:in `call'
actionpack (4.1.1) lib/action_dispatch/middleware/show_exceptions.rb:30:in `call'
railties (4.1.1) lib/rails/rack/logger.rb:38:in `call_app'
railties (4.1.1) lib/rails/rack/logger.rb:20:in `block in call'
activesupport (4.1.1) lib/active_support/tagged_logging.rb:68:in `block in tagged'
activesupport (4.1.1) lib/active_support/tagged_logging.rb:26:in `tagged'
activesupport (4.1.1) lib/active_support/tagged_logging.rb:68:in `tagged'
railties (4.1.1) lib/rails/rack/logger.rb:20:in `call'
actionpack (4.1.1) lib/action_dispatch/middleware/request_id.rb:21:in `call'
rack (1.5.2) lib/rack/methodoverride.rb:21:in `call'
rack (1.5.2) lib/rack/runtime.rb:17:in `call'
activesupport (4.1.1) lib/active_support/cache/strategy/local_cache_middleware.rb:26:in `call'
rack (1.5.2) lib/rack/lock.rb:17:in `call'
actionpack (4.1.1) lib/action_dispatch/middleware/static.rb:64:in `call'
rack (1.5.2) lib/rack/sendfile.rb:112:in `call'
railties (4.1.1) lib/rails/engine.rb:514:in `call'
railties (4.1.1) lib/rails/application.rb:144:in `call'
rack (1.5.2) lib/rack/lock.rb:17:in `call'
rack (1.5.2) lib/rack/content_length.rb:14:in `call'
rack (1.5.2) lib/rack/handler/webrick.rb:60:in `service'
C:/Ruby200/lib/ruby/2.0.0/webrick/httpserver.rb:138:in `service'
C:/Ruby200/lib/ruby/2.0.0/webrick/httpserver.rb:94:in `run'
C:/Ruby200/lib/ruby/2.0.0/webrick/server.rb:295:in `block in start_thread'
Request
Parameters:
{"utf8"=>"✓",
"authenticity_token"=>"78m9sOtlwoTKfAUdysKZoLiDHU4ikX/cVs8epIbEuag=",
"nation"=>{"name"=>"sdfsf",
"ruler"=>"sdfsdf",
"government"=>"green",
"description"=>"sdfsdfsdf",
"flag"=>#<ActionDispatch::Http::UploadedFile:0x2dcc5a0 @tempfile=#<Tempfile:C:/Users/JFR/AppData/Local/Temp/RackMultipart20140624-5808-bnuxjh>,
@original_filename="cane2008.png",
@content_type="image/png",
@headers="Content-Disposition: form-data; name=\"nation[flag]\"; filename=\"cane2008.png\"\r\nContent-Type: image/png\r\n">},
"commit"=>"Post"}
Toggle session dump
_csrf_token: "78m9sOtlwoTKfAUdysKZoLiDHU4ikX/cVs8epIbEuag="
session_id: "e874179e9713d0a2009b5908423f7290"
Toggle env dump
GATEWAY_INTERFACE: "CGI/1.1"
HTTP_ACCEPT: "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
HTTP_ACCEPT_ENCODING: "gzip, deflate"
HTTP_ACCEPT_LANGUAGE: "it-IT,it;q=0.8,en-US;q=0.5,en;q=0.3"
HTTP_CACHE_CONTROL: "max-age=0"
REMOTE_ADDR: "127.0.0.1"
REMOTE_HOST: "127.0.0.1"
SERVER_NAME: "localhost"
SERVER_PROTOCOL: "HTTP/1.1"
Response
Headers:
None
As explained at http://guides.rubyonrails.org/form_helpers.html#uploading-files there is no need to set form's encoding to "multipart/form-data" when using form_for (as opposed to using form_tag).
What can it be then? I fear that I'm experiencing some incompatibilities issues between ruby and rails version? Any quick fix? Thanks.
You cannot assign a file object to a binary column and save it. If you really want to just save the file's contents to the database, call
read
on it before assigning it to your model. You probably want to do something more suited for file uploads, though. Take a look at CarrierWave and Paperclip