2.3.4 改进“查看留言”
scaffold代码生成器生成的代码是不能满足我们查看留言的需求的,它不能显示图片,界面也十分简陋,这需要我们来改进“查看留言”部分的代码。
修改/app/views/message路径下的show.rhtml视图文件,修改后用于显示留言的代码片段如下。
<table width="80%" border=0 align="center" class="pt9" cellpadding=10 cellspacing="1" bgcolor="#BFCAE6"> <tr> <td> <p> <label for="message_name">标题:</label> <%= @message.title %> </p> <p> <label for="message_description">内容:</label> <%= @message.detail %> </p> <p> <label for="message_picture">图片:</label> <!-- 如果留言有图片 --> <% if @message.has_picture? then %> <!-- 调用url_for帮助方法,生成一个URL --> <img height=120 width=120 align="center" src="<%= url_for(:action => "show_picture", :id => @message.id) %>"/> <% else %> <i>无图片</i> <% end %> </p> <p> <label for="message_time">留言时间:</label> <%= show_date(@message.created_at)%> </p> <p> <label for="message_category">留言人:</label> <!-- 调用user实例方法,返回Message对象对应的User对象 --> <%= @message.user.name %> </p> <br> <%= link_to '返回', :action => 'list' %> </td> </tr> </table> |
上面的代码中,Message对象调用has_picture?方法来查询留言是否有图片(has_picture?方法定义的代码已经在前面2.3.2节中介绍过)。如果留言有图片,则调用Rails提供的url_for帮助方法,生成一个将会向show_picture Action发送请求的URL。然后通过这个Action来负责显示图片。
在message_controller.rb控制器文件中,添加show_picture Action的定义,该Action负责把数据库里保存的图片二进制数据转换成图片输出。该Action代码片段如下:
# 该方法用于在线显示图片 def show_picture @message = Message.find(params[:id]) # 如果留言有图片 if @message.has_picture? then # 通过调用send_data方法来发送图片中的二进制数据给用户 send_data(@message.picture_data, # 通过将disposition选项设置为inline,指定直接显示该图片,而不是附件 :disposition => "inline", # 指定一个HTTP内容类型 :type => @message.picture_content_type) end end |
上面的方法定义通过调用Rails的send_data方法来把二进制数据转换成图片输出。其中,send_data方法的disposition选项应该指定为inline,否则,将会把文件以附件的形式下载。
修改完毕上述的代码之后,可以在浏览留言页面中选择一条标注为红色的“有图”字样的记录,单击它的“查看”链接,即可查看该留言的详细信息,包括图片。在浏览器中的显示效果如图2.11所示。
 |
| 图2.3 firstApp应用 |
图2.11 查看有图的留言
如图2.11所示,页面中不仅显示出留言的文本信息,同时显示出了图片。如果用户查看的是一条没有图片的留言记录,则用于显示图片的位置将仅仅显示“无图片”的文本提示信息。
【责任编辑:
雪花 TEL:(010)68476606】