【问题标题】:undefined method `path' for nil:NilClass semantic_form_for railsnil 的未定义方法“路径”:NilClass semantic_form_for rails
【发布时间】:2015-08-21 17:39:28
【问题描述】:

我正在尝试使用 semantic_form_for 上传要解析属性的文件,但我似乎无法让它工作,尽管从我读过的内容来看它应该是。我已经有一段时间了,似乎无法得到任何工作。

这是我的观点.haml:

= semantic_form_for(@user, :url => import_users_path, :html => {:multipart => true} ) do |f|
        = f.inputs :id => 'inputs' do
          = f.input :filename, :as => :file
        %br
        %br
        = f.actions do
          = f.action :submit, :label => 'BULK UPLOAD'

和用户控制器导入功能:

 def import
    myfile = params[:filename]

    CSV.foreach(myfile.path, headers: true) do |row|
      @user = User.new(params[:user])
      @user.name = row['Name']
      @user.email = row['Email']
      @user.save
    end
    redirect_to users_url 
  end

无论出于何种原因,该文件似乎没有被传递到导入函数中。它适用于 form_for,但不适用于我需要尝试使用的 semantic_form_for。感谢您的帮助!

【问题讨论】:

  • 你的import_users_path 是正确的,你确定吗?它需要任何参数吗?可以查一下吗?
  • @KMRakibulIslam 绝对正确,这之前与 = form_tag import_users_path, multipart: true do 一起使用,我现在只是将其切换为语义形式
  • 你能发布完整的错误堆栈跟踪吗?好像网址有问题
  • 你能运行这个吗? rake routes | grep import 并显示输出?
  • 您能试试我的解决方案并告诉我是否可行吗?只需更改控制器的导入操作中的一行:@user = User.new

标签: ruby-on-rails forms csv import formtastic


【解决方案1】:

只需在控制器的导入方法中将myfile = params[:filename] 更改为myfile = params[:user][:file]

def import
  myfile = params[:user][:file]

  CSV.foreach(myfile.path, headers: true) do |row|
    @user = User.new
    @user.name = row['Name']
    @user.email = row['Email']
    @user.save
  end
  redirect_to users_url
end

【讨论】:

  • 这会导致 CSV.foreach 行出现相同的错误。另外,这种方法是创建多个用户,所以在顶部创建用户不会只创建一个新用户吗?我的控制器按预期使用 form_for,而不是使用 semantic_form_for,所以我认为这里的用户不需要更改它,它是 myfile.path 即将出现的 null
  • 请在发布表单时显示完整的堆栈跟踪和params 哈希。
  • 哦,我明白了。更改:params[:filename]params[:file],如您所用:as: file
  • 同样的结果,呃,原来如此
  • 我知道这行得通,我只是在尝试使用 semantic_form_for 并且想知道为什么它不起作用。我最初使用 form_tag(正如我在上面的 cmets 中所说),但试图将其切换到 semantic_form_for,因为它已在我的整个应用程序中使用,并且无法理解为什么它不起作用,因为 form_tag 工作完美
【解决方案2】:

它看起来像一些 url 问题

<% semantic_form_for :post, Post.new, :url => posts_path do |f| %>
  ...
<% end %>

看看http://www.rubydoc.info/gems/formtastic/0.9.10/Formtastic/SemanticFormHelper

试试这个表单会在用户新操作中打开对吗?那么……

def new 
 @user = User.new 
end


def import
  CSV.foreach(myfile.path, headers: true) do |row|
    @user = User.new(params[:user])
    @user.name = row['Name']
    @user.email = row['Email']
    @user.save
   end
   redirect_to users_url 
end


<%= semantic_form_for(@user, :url => import_users_path(@user)) do |f| %>

<% end %>

【讨论】:

  • 当我将它与我的 semantic_form_for 一起使用时,这只会导致 wrong number of arguments (3 for 1..2)
  • 你能运行 rake 路由吗? grep 导入并将路线放在这里
  • import_users POST /users/import(.:format) users#import@Arv
  • @seanscal 我又添加了一个代码,请检查一下,因为类似的代码对我有用。
猜你喜欢
  • 2020-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-23
  • 2017-08-04
  • 1970-01-01
  • 2011-07-11
  • 1970-01-01
相关资源
最近更新 更多