【问题标题】:Rails Carrierwave upload multiple files undefined method `[]' for nil:NilClassRails Carrierwave 上传多个文件 undefined method `[]' for nil:NilClass
【发布时间】:2023-04-05 17:49:01
【问题描述】:

请有人解释一下为什么会这样

nil:NilClass 的未定义方法 `[]'

在使用 rails、carrierwave 和 react 上传文件时发生了什么?

其余代码非常标准,因此在上传图片的日志中,post_attachments 中的图片属性始终显示为空白。

我怀疑问题出在 post create 上的 post_attachments 上的 rails 循环,你们怎么看?

我变成了

 params[:post_attachments].each do |image|
    img = PostAttachment.new
    img.image = image
    @post.post_attachments << img
  end 

仍然显示错误。

所以请,有人知道为什么这与载波和反应?

这里是后期控制器

  def create


    @post = current_user.posts.build(post_params)


    if @post.save
      #unless params[:post_attachments].nil?
        params[:post_attachments]['image'].each do |a|
          @post_attachment = @post.post_attachments.create!(:image => a, :post_id => @post.id)

      #end


    end

    render json: "Posted successfully", status: 201
    else
      render json: @post.errors, status: :unprocessable_entity
    end
  end

和反应

  async sendImage(forma) {
    let self = this;
    let errs = 0;
    let auth_token = await AsyncStorage.getItem(AUTH_TOKEN);

    try {
      let response = await fetch("https://localhost:3000/posts", {
        method: "POST",
        headers: {
          Accept: "application/json",

          //"Content-Type": "multipart/form-data",
          Access: auth_token
        },
        body: forma
      });
      let res = await response.text();
      if (response.status >= 200 && response.status < 300) {
      } else {
        //Handle errors
        let error = res;
        throw error;
      }
    } catch (errors) {
      //errors are in JSON form so we must parse them first.
      let formErrors = JSON.parse(errors);
      //We will store all the errors in the array.
      let errorsArray = [];
      for (var key in formErrors) {
        //If array is bigger than one we need to split it.
        if (formErrors[key].length > 1) {
          formErrors[key].map(error => errorsArray.push(`${key} ${error}`));
        } else {
          errorsArray.push(`${key} ${formErrors[key]}`);
        }
      }
      this.setState({ errors: errorsArray });
      //this.setState({showProgress: false});
    }
  }

  async uploadImage() {
    const { params } = this.props.navigation.state;
    let image = params ? params.image : null;
    let photos = params ? params.photos : [];

    var self = this;
    let forma = new FormData();

    forma.append("post[title]", String(this.state.title));
    forma.append("post[body]", String(this.state.body));

    forma.append("post[post_attachments][image][]", 'teste');

    for (let i = 0; i < photos.length; ++i) {
      await fs
        .readFile(photos[i], "base64")
        .then(async blob => {
          //forma.append("post[post_attachments][image][]", 'teste');

        .catch(error => {
          console.log("loop err", error);
        });
    }

    self.sendImage(forma);
  }

日志截图

【问题讨论】:

  • 你能调试或显示你的控制台日志params包含什么吗?
  • @Gabbar 感谢您的关注。是的,我会截图

标签: javascript ruby-on-rails reactjs react-native carrierwave


【解决方案1】:

参数是这样的: -

paramaters: {"post" = > .... "post_attachments" => {"image" => ["test"]}}

所以image_params应该是这样的-

image_params = params[:post][:post_attachments][:image]

  unless image_params.blank?
    image_params.each do |image|
      img = PostAttachment.new
      img.image = image
      @post.post_attachments << img
    end 
  end

【讨论】:

  • @lula 但是我已经解决了你的问题undefined method []' for nil:NilClass` 但就我观察到你的参数不包含动作调度程序,它不是图像数据。考虑到这一点被接受并创建一个单独的问题来询问如何通过反应发送图像属性,因为我已经解决了这个问题的原始问题。谢谢。
  • 感谢您的回答@Gabbar,但不知何故在日志中显示未定义的局部变量或方法`image_params'
  • 啊抱歉,我忘记添加变量了
  • @lula 你在使用之前定义了image_params = params[:post][:post_attachments][:image]吗?只需在每个循环前放置一行,请查看答案。
猜你喜欢
  • 2013-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-27
  • 2017-07-04
  • 2020-09-24
相关资源
最近更新 更多