轻松掌握RubyonRails上传图片实现技巧

Ruby on Rails作为一种WEB开发框架,拥有许多关于网站建设的功能,帮助我们简单完善自身的网站开发。比如图片的上传等。下面我们就为大家介绍Ruby on Rails上传图片的相关技巧。#t#

作为一家“创意+整合+营销”的成都网站建设机构,我们在业内良好的客户口碑。成都创新互联提供从前期的网站品牌分析策划、网站设计、成都做网站、成都网站制作、创意表现、网页制作、系统开发以及后续网站营销运营等一系列服务,帮助企业打造创新的互联网品牌经营模式与有效的网络营销方法,创造更大的价值。

我们希望当新增留言的时候,允许用户上传图片,并能判断上传文件的类型是否为图片和文件是否过大。这在Rails中不难做到,不需要使用任何插件,只用十分简洁的代码即可实现Ruby on Rails上传图片!这的确是一件让程序员愉快的事情。

修改/app/views/message路径下的new.rhtml视图文件。修改后的代码如下:

  1. < table valign="top" width="100%" 
    border="0" cellspacing="0" cellpadding="0">
  2. < tr>
  3. < td> 
  4. < center>
  5. < %= error_messages_for 'message' %>
  6. < /center>
  7. < !-- 将multipart选项设置为true,允许上传文件 -->
  8. < %= start_form_tag ({ :action => 
    'create', :id => @message }, :multipart => true) %>
  9. < table align="center" width="400"
     border="0" cellpadding="0" cellspacing="0"
  10. bgcolor="#BFCAE6">
  11. < tr>
  12. < td colspan="2" id="title">新增留言< /td>
  13. < /tr> 
  14. < tr>
  15. < td width="15%">< b>标题< /b>< /td>
  16. < td >< %= text_field('message', 
    'title', :size => "30")%>< /td> 
  17. < /tr>
  18. < tr>
  19. < td width="15%">< b>内容< /b>< /td>
  20. < td >< %= text_area 'message', 
    'detail', "cols" => 40, "rows" => 10 %>< /td>
  21. < /tr>
  22. < tr>
  23. < td width="15%">< b>贴图< /b>< /td>
  24. < !-- 调用file_field帮助方法,生成一个文件域 -->
  25. < td >< %= file_field 'message', 'picture' %>< /td>
  26. < /tr>
  27. < tr>
  28. < td colspan="2" align="center">< 
    %= submit_tag '提交' %>< /td>
  29. < /tr>
  30. < /table>
  31. < %= end_form_tag %>
  32. < /td>
  33. < /tr>
  34. < /table>

上面的Ruby on Rails上传图片代码在start_form_tag帮助方法中指定multipart的选项值为true,使得该表单能够发送文件数据。并且,通过调用file_field帮助方法,生成了一个文件域。这里的picture属性只是个虚拟属性,因为在数据库的messages表中并不存在这个属性。这需要我们对这个虚拟属性做一些处理,使之对应messages表中的真实属性。具体实现方式下面会有详细介绍。

上面的表单是没有为留言时间设计表单域的,因为我们可以通过更简便的方式来为Message对象的这个属性赋值:messages表中表示留言时间的字段名为created_at,数据类型设计为timestamp,这样,当保存一条Message对象对应的记录时,Rails就会自动将当前时间赋值给created_at列,而不需要我们手动赋值。

在message_controller.rb控制器文件中,需要修改create方法,修改后该方法的Ruby on Rails上传图片代码片段如下。

 
 
 
  1. def create
  2. # 查找出当前留言的User对象
  3. user=User.find(session[:user_id])
  4. # 将该User对象赋值给参数中
    Message对象的user属性
  5. params[:message][:user]=user
  6. # 构造一个Message对象,
    并使用message参数来初始化该对象
  7. @message = Message.new(params[:message])
  8. # 如果Message对象能成功保存进数据库
  9. if @message.save
  10. flash[:notice] = '新增留言成功!'
  11. # 重定向到list Action
  12. redirect_to :action => 'list'
  13. else
  14. # 提交new Action
  15. render :action => 'new'
  16. end
  17. end

在create方法的定义中,前面两句代码是scaffold生成的默认代码中所没有的。这是因为user_id是messages表参照users表的外键列,scaffold不会自动生成对外键列的操作。所以,我们需要根据session[:user_id]来查找出留言的User对象,并把该对象赋值给表单参数中的Message对象,作为它的一个user属性。这样,当Message对象调用save方法保存进数据库的时候,会让该Messge对象对应的数据行参照到该User实例对应的数据行。

在Message Model文件中,重定义一个picture=方法。因为我们的new.rhtml视图文件中有一个picture表单域,当提交表单后控制器将发送一个message[:picture]的请求参数,这个请求参数将要求Message类里包含一个picture=方法,该方法用于接受message[:picture]请求参数。

picture=方法负责把message[:picture]请求参数(这个请求参数值是一个文件对象,里面包含了非常丰富的信息)解析出来。下面是picture=方法的代码:

 
 
 
  1. # 提供picture=方法,将一个picture
    的表单域设置成Message对象的多个属性 
  2. def picture=(picture_field)
  3. transaction do 
  4. # 如果用户上传了图片
  5. if picture_field.size>0 then
  6. # @picture_size为上传图片的文件大小
  7. @picture_size=picture_field.size
  8. # @picture_type为上传图片的文件类型
  9. @picture_type=picture_field.content_type.chomp 
  10. # 设置Message对象的picture_content_type属性
  11. self.picture_content_type =@picture_type 
  12. # 设置Message对象的picture_data属性
  13. self.picture_data = picture_field.read 
  14. end
  15. end
  16. end

提供了picture=方法之后,我们就将message[:picture]请求参数与messages表中的真实属性picture_content_type和picture_data对应起来了。

在Ruby on Rails上传图片方面,Rails处理得很好,表单中的文件域参数值不再是一个简单的类型值,而是已经被包装成一个文件对象,它也有size,content_type和read方法,直接调用这些方法,即可返回这个文件对象的大小、文件类型和包含的二进制数据。

当用户添加一条留言时,我们需要对留言对象进行模型校验,这可以通过在message.rb模型文件中重写validate方法来实现。代码如下:

 
 
 
  1. def validate 
  2. # 验证title不能为空 
  3. errors.add("", "标题不能为空") if title.empty?
  4. # 验证detail不能为空 
  5. errors.add("", "内容不能为空") if detail.empty?
  6. # 下面校验上传的图片
  7. if @picture_type != nil
  8. # 校验上传图片的文件类型
  9. errors.add("", "贴图不是合法的图片文件") 
    unless @picture_type =~ /^image/
  10. end
  11. if @picture_size != nil
  12. # 校验上传图片的文件大小
  13. errors.add("", "贴图文件太大,应不能超过50 
    KB") if @picture_size > MAX_IMAGE_SIZE
  14. end
  15. end

在上面的Ruby on Rails上传图片代码中,我们校验留言标题、留言内容的值不能为空,上传的文件类型必须是图片形式,并且文件大小不能超过允许上传的***图片值(MAX_IMAGE_SIZE为允许上传的***图片值)。

标题名称:轻松掌握RubyonRails上传图片实现技巧
标题网址:http://www.shufengxianlan.com/qtweb/news37/534537.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联