日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產(chǎn)品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
輕松掌握RubyonRails上傳圖片實現(xiàn)技巧

Ruby on Rails作為一種WEB開發(fā)框架,擁有許多關于網(wǎng)站建設的功能,幫助我們簡單完善自身的網(wǎng)站開發(fā)。比如圖片的上傳等。下面我們就為大家介紹Ruby on Rails上傳圖片的相關技巧。#t#

作為一家“創(chuàng)意+整合+營銷”的成都網(wǎng)站建設機構,我們在業(yè)內良好的客戶口碑。成都創(chuàng)新互聯(lián)提供從前期的網(wǎng)站品牌分析策劃、網(wǎng)站設計、成都做網(wǎng)站、成都網(wǎng)站制作、創(chuàng)意表現(xiàn)、網(wǎng)頁制作、系統(tǒng)開發(fā)以及后續(xù)網(wǎng)站營銷運營等一系列服務,幫助企業(yè)打造創(chuàng)新的互聯(lián)網(wǎng)品牌經(jīng)營模式與有效的網(wǎng)絡營銷方法,創(chuàng)造更大的價值。

我們希望當新增留言的時候,允許用戶上傳圖片,并能判斷上傳文件的類型是否為圖片和文件是否過大。這在Rails中不難做到,不需要使用任何插件,只用十分簡潔的代碼即可實現(xiàn)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,使得該表單能夠發(fā)送文件數(shù)據(jù)。并且,通過調用file_field幫助方法,生成了一個文件域。這里的picture屬性只是個虛擬屬性,因為在數(shù)據(jù)庫的messages表中并不存在這個屬性。這需要我們對這個虛擬屬性做一些處理,使之對應messages表中的真實屬性。具體實現(xiàn)方式下面會有詳細介紹。

上面的表單是沒有為留言時間設計表單域的,因為我們可以通過更簡便的方式來為Message對象的這個屬性賦值:messages表中表示留言時間的字段名為created_at,數(shù)據(jù)類型設計為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對象賦值給參數(shù)中
    Message對象的user屬性
  5. params[:message][:user]=user
  6. # 構造一個Message對象,
    并使用message參數(shù)來初始化該對象
  7. @message = Message.new(params[:message])
  8. # 如果Message對象能成功保存進數(shù)據(jù)庫
  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不會自動生成對外鍵列的操作。所以,我們需要根據(jù)session[:user_id]來查找出留言的User對象,并把該對象賦值給表單參數(shù)中的Message對象,作為它的一個user屬性。這樣,當Message對象調用save方法保存進數(shù)據(jù)庫的時候,會讓該Messge對象對應的數(shù)據(jù)行參照到該User實例對應的數(shù)據(jù)行。

在Message Model文件中,重定義一個picture=方法。因為我們的new.rhtml視圖文件中有一個picture表單域,當提交表單后控制器將發(fā)送一個message[:picture]的請求參數(shù),這個請求參數(shù)將要求Message類里包含一個picture=方法,該方法用于接受message[:picture]請求參數(shù)。

picture=方法負責把message[:picture]請求參數(shù)(這個請求參數(shù)值是一個文件對象,里面包含了非常豐富的信息)解析出來。下面是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]請求參數(shù)與messages表中的真實屬性picture_content_type和picture_data對應起來了。

在Ruby on Rails上傳圖片方面,Rails處理得很好,表單中的文件域參數(shù)值不再是一個簡單的類型值,而是已經(jīng)被包裝成一個文件對象,它也有size,content_type和read方法,直接調用這些方法,即可返回這個文件對象的大小、文件類型和包含的二進制數(shù)據(jù)。

當用戶添加一條留言時,我們需要對留言對象進行模型校驗,這可以通過在message.rb模型文件中重寫validate方法來實現(xiàn)。代碼如下:

 
 
 
  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上傳圖片實現(xiàn)技巧
鏈接分享:http://www.dlmjj.cn/article/dhpojge.html