2

次のようなデータをインポートするためのフォームがあります。

<%= form_tag({ controller: 'courses', action: :import }, multipart: true) do %> 
  <%= label_tag 'file', 'Import data' %>
  <%= file_field_tag 'file' %>
  <%= submit_tag "Import", name: nil, class: 'btn' %>
<% end %>

これは私のインポートアクションです:

def import
  require 'csv'

  csv_text = File.read(params[:file].tempfile.to_path.to_s)
  csv = CSV.parse(csv_text, headers: true )
  csv.each do |row|
    row = row.to_hash.with_indifferent_access
    Course.create(row.to_hash.symbolize_keys)
  end
  flash[:success] = "Successfully import data."
  redirect_to courses_url
end

しかし、ファイルを選択Importしてブラウザのボタンを押すと、エラーが発生しました:

ActiveModel::MassAssignmentSecurity::Error in CoursesController#import
Can't mass-assign protected attributes: Name, Code

私のCourseモデルではnamecodeすでにattr_accessibleです:

class Course < ActiveRecord::Base
  attr_accessible :code, :name
end

私のコードの何が問題になっていますか?

更新
これは私のcsvファイルです:

name, code
ERP System, HT555DV01
Data Mining, HT459DV01

データを作成するための新しいコード

csv.each do |row|
  Course.create!(name: row[0], code: row[1])
end
4

2 に答える 2

3

これを試して

csv.each do |row|
  row = row.to_hash.with_indifferent_access
  Course.create(row.to_hash.symbolize_keys)
end

に置き換える

  csv.each do |row|
    Course.create(row.to_hash)
  end

アップデート

csv_file = File.read(params[:file].tempfile.to_path.to_s)
csv = CSV.parse(csv_file, :headers => true) 
csv.each do |row|
   Course.create!(:name => row[0], :code => row[1])    
end    

アップデート2

csv_file = params[:file].read
CSV.parse(csv_file) do |row|
   course = Course.create(row)
   course.save
end

ソース= > http://www.funonrails.com/2012/01/csv-file-importexport-in-rails-3.htmlhttp://erikonrails.snowedin.net/?p=212

于 2012-11-06T08:38:13.657 に答える
1

Course.create(row.to_hash.symbolize_keys, :without_protection => true)それをDipakの提案と組み合わせてみてください。

あるいは、私は好むでしょうCourse.create!(name: row['name'], code: row['code'])

于 2012-11-06T08:47:40.683 に答える