新手问题 rails 执行 修改 时 异常 :undefined method `name' for nil:NilClass

tank_lei · 2013年10月31日 · 最后由 crazyphage 回复于 2016年01月18日 · 4118 次阅读

controller 中:

def update
        @product = Product.find(params[:id])
        unless request.get?          ##1
            filename=uploadfile(product_params[:image_url])   ##2
        end     ##3
        puts @product.name
        puts product_params
        if @product.update(product_params)
            redirect_to admins_products_path
        else
            render 'edit'
        end
    end

edit.html.erb 页面:

<%= form_for @product, id: "update_product", url: admins_product_path do |f|%>
    <table border="1">
        <tr>
            <td>
                产品名称
            </td>
            <td>
                <%= f.text_field :name %>
            </td>
        </tr>   
        <tr>   ##4
            <td>##5
                产品图片##6
            </td> ##7
            <td>##8
                <%= f.file_field :image_url %>##9
            </td>##10
        </tr>##11
        <tr>
            <td>
                产品价格
            </td>
            <td>
                <%= f.text_field :price %>
            </td>
        </tr>
        <tr>
            <td>
                产品描述
            </td>
            <td>
                <%= f.text_area :description %>
            </td>
        </tr>
        <tr>
            <td>
                <input type="submit" value="提交">
            </td>
        </tr>
    </table>
<% end %>

说明:这里实现的就是 products 管理的功能,在产品创建的时候,图片能够正确提交。 问题:当我执行修改的时候,会出现错误:undefined method `name' for nil:NilClass 查看 log 发现:##3 之后的两个 puts 都有数据: 44444 {"name"=>"44444", "description"=>"3dsfs", "image_url"=>#, @original_filename="1111.jpg", @content_type="image/jpeg", @headers="Content-Disposition: form-data; name=\"product[image_url]\"; filename=\"1111.jpg\"\r\nContent-Type: image/jpeg\r\n">, "price"=>"98.0"}

当我把行##1、2、3、4、5、6、7、8、9、10 都给删除了,就能够正确提交,也就是把图片处理这一块给删除掉

这个异常如何解决呢?

我是自己写的文件上传方法,暂时不考虑用插件

楼主不是新人了,请把代码格式化好。

自己解决了,但有点莫名其妙 就是有定义了一个变量 p,然后把 product_params 赋值给 p,然后对 p 进行操作,应为页面传递过来的 image_url 是一个文件类型,我数据库是 string 类型,所以这里通过 p[:image_url] = filename 赋值为字符串 然后再更新就没有问题

自己解决了,但有点莫名其妙 就是有定义了一个变量 p,然后把 product_params 赋值给 p,然后对 p 进行操作,应为页面传递过来的 image_url 是一个文件类型,我数据库是 string 类型,所以这里通过 p[:image_url] = filename 赋值为字符串 然后再更新就没有问题

自己解决了,但有点莫名其妙 就是有定义了一个变量 p,然后把 product_params 赋值给 p,然后对 p 进行操作,应为页面传递过来的 image_url 是一个文件类型,我数据库是 string 类型,所以这里通过 p[:image_url] = filename 赋值为字符串 然后再更新就没有问题

#2 楼 @Rei 哈哈,着急就没有弄,现在解决了

两年后都能遇到这个问题,实在是有点奇怪。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号