rails: undefined method `encoding' for #

2019-09-16 18:24发布

问题:

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.

回答1:

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