【问题标题】:Ruby on Rails: undefined method `[]' for nil:NilClass when iterate array of filesRuby on Rails:迭代文件数组时,nil:NilClass的未定义方法`[]'
【发布时间】:2014-07-27 23:25:13
【问题描述】:

我有一个表单,我根据用户想要生成的次数生成一组特定的用户输入字段

示例:

如果用户给出 2 作为输入,那么一段 javascript 将生成两组相同的输入字段

工作流程示例:

有多少用户:2

//生成的字段

输入用户 1 信息

  • 姓名:
  • 地址:
  • 照片:

输入用户 2 信息

  • 姓名:
  • 地址:
  • 照片:

我已将字段名称设置为数组

<input type="text" name="name[]" >
<input type="text" name="address[]" >
<input type="file" name="photo[]" >
<input type="hidden" name="user_count" value="count">

在我的控制器中,当循环到达照片字段时,它会抛出错误undefined method [] for nil:NilClass

      @current_user = 0
      @number_of_users = params[:user_count].to_i 

      until @curret_field > (@number_of_users-1)  do  
        @user=User.new
        @user.name=params[:name][@current_user]
        @user.address=params[:address][@current_user]
        @user.photo=params[:photo][@current_user]
      end

【问题讨论】:

  • 这意味着params哈希不包含键photo
  • 只有在照片字段留空并提交时才会抛出此错误。
  • 如果我们提交的表单params[:user_count] 高于实际输入数,此代码将中断
  • 你是对的@MrYoshiji,我已经验证了我的javascript中的输入,它会生成一组相同的输入字段,只有输入值小于20。

标签: ruby-on-rails file-upload paperclip forms


【解决方案1】:

您可以使用.try 方法来测试缺少哪个参数:

params[:name].try(:[], @current_user) # returns nil if can't access to it

但我会将我的参数键/值映射更改为以下内容:

@users.each_with_index do |user, i|
  text_field_tag "users[#{i}]name"
  text_field_tag "users[#{i}]address"
  file_field_tag "users[#{i}]photo"
end

然后像这样在控制器中循环:

params[:users].each do |user_params|
  User.new(user_params)
end

【讨论】:

  • 感谢Yoshiji先生的回复,这个错误只有在照片字段留空并提交时才会抛出。 ——
  • 然后你可以使用params[:photo].try(:[], @current_user)
猜你喜欢
  • 2019-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-16
  • 2017-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多