`

为程序增加tag功能

阅读更多
http://hobo.tylerlesmann.com/entries/4-make-a-blog-with-hobo-tagging

In this episode, we’ll add tagging support to our blog. Features of this lesson will be applicable to any many-to-many relationship in Hobo. Before I go any further, at the time of this writing, Hobo does not support has_and_belongs_to_many :models. A many-to-many relationship will only be blessed with the Hobo magic when implemented using has_many :models, :through => :join_model.

We need two tables, one for tags and a join table. We create these with the following commands:

$ script/generate hobo_model_resource tag name:string
$ script/generate hobo_model tag_assignment
Only thing you haven’t seen before is the hobo_model. It’s like hobo_model_resource less the controllers, which a join table doesn’t need. Let’s add the relationship code to the models. Add these lines to their indicated files before the # — Permissions — # line.

app/models/entry.rb

has_many :tags, :through => :tag_assignments, :accessible => true
has_many :tag_assignments, :dependent => :destroy
app/models/tag.rb

# Let's change the ordering while we're in here.  It defaults to created_at.
# This will affect how cards are ordered as well as when tags are viewed as
# a whole.
set_default_order "name"

has_many :entries, :through => :tag_assignments
has_many :tag_assignments, :dependent => :destroy
app/models/tag_assignment.rb

belongs_to :entry
belongs_to :tag
Most of this is pure rails, except for the :accessible. This tells Hobo to build tag assignment into the form for Entry. Whenever a user accesses a tag’s show page, Hobo will display any child objects the coder describes. To describe children, we edit the viewhints, which in this case is app/viewhints/tag_hints.rb. Add this line:

children :entries
Time to apply the changes to the database!

$ script/generate hobo_migration
Note that if you’ve been following along to this tutorial, you will need to add tags to the fields of field-list for the Entry form, if you want to see how regular many-to-many relationships work in Hobo. You’ll remember that the form is described in app/views/taglibs/application.dryml. The way Hobo does these relationships is clumsy as you’ll see, for tagging anyway. It would be better for the blogger to just enter a bunch of words and phrases separated by commas. Let’s make it work that way. Add the following line to the list of fields in app/models/entry.rb:

tagstring     :string
This will hold the input string for the user. Now there are a few ways to handle the actual assignment of the tags to the blog entry. We could implement it like we did markdown formatting for posts earlier. Since I haven’t shown how to go outside the box in controllers yet, we’ll do it that way. Open app/controllers/entries_controller.rb and add the following lines before the last end.

def assign_tags
  params["entry"]["tags"] = params["entry"]["tagstring"].split(',').collect{
    |tag|
    '@' + Tag.find_or_create_by_name(tag.strip).id.to_s
  }
end

def create
  assign_tags
  hobo_create
end

def update
  assign_tags
  hobo_update
end
The meat of the changes is in the assign_tags method. Here we take the tagstring field and split it by commas. Then, we create or get a Tag instance for each tag, pull the id, and add @ to the front of the id. All of these ids are put into the tags param where Hobo will look at them later. We add two other methods: create and update. These will override the default Hobo/rails actions. We first call assign_tags to parse the tags. After this we use hobo_create or hobo_update, which invokes the usual Hobo handling.

Make sure you have the tagstring in the fields of the Entry form and apply the changes to the database.

$ script/generate hobo_migration
Look at that! Easy tagging! One last thing. Let’s make the tags a bit more visible by having them appear on the show page and card for Entry. Since we will need the same code in both places, we will make a new DRYML tag. In app/views/taglibs/application.dryml, remove the existing <extend tag="card" for="Entry"/> and add this:

<extend tag="card" for="Entry">
  <old-card merge>
    <prepend-body:>
      <entry-info/>
    </prepend-body:>
  </old-card>
</extend>

<def tag="entry-info">
  <div>
    Posted on <view:created-at/>
  </div>
  <div>
    Tags: <view:tags/>
  </div>
</def>
Alter app/views/entries/show.dryml to be like this:

<show-page>
  <append-content-header:>
   <entry-info/>
  </append-content-header:>
  <field-list: replace>
    <view:body_html/>
  </field-list:>
</show-page>
In DRYML, tags are includes with a bit of extra magic. For instance, in this entry-info tag, we are using <view:created-at/> and <view:tags/>. Hobo knows how to handle these depending on the context. If used out of context, Hobo gracefully outputs Not Available. To use a tag, we simply use it by name, like <entry-info/>.

Take a look at the results. Hobo made the entry’s tags each link to the tag’s show page. The tags are more visible and users can easily navigate to similarly tagged blog posts.
分享到:
评论

相关推荐

    WordPress小程序开源版源码_酱茄小程序_ v1.0.5_微信小程序

    2.13、文章详情Tag功能; 2.14、屏蔽指定分类文章功能; 2.15、文章描述停用开启功能; 注意:压缩包中的api文件夹为WordPress插件,client文件夹为小程序源码。   1、新增打开第三方小程序功能; 2、新增文章详情...

    帝国cms-TAG高级管理 UTF-8完整版.zip

    - 这个功能意味着系统可以自动识别并提取文章中的关键词,并将其转化为TAG,这样不仅减轻了管理员的工作负担,还能确保关键词与内容的准确匹配,提高搜索引擎的抓取效率。 3. **增加内链锚文本**: - 内链(内部...

    连接PI数据库,取tag值

    在`PI_Edit`项目中,你可能会找到示例代码,涵盖了以上所有操作,这将帮助你更好地理解和实践这些功能。通过深入理解并运用这些知识点,你可以构建出强大的PI数据库应用,实现高效的数据读取和处理。

    小程序登录/注册页面设计的实现代码

    在小程序开发中,登录和注册页面是至关重要的组成部分,它们为用户提供访问应用的入口,并确保用户数据的安全。本文将详细讲解如何实现小程序的登录/注册页面设计,包括关键的代码实现和功能模块。 首先,界面设计...

    酱茄WordPress小程序开源版源码

    “酱茄小程序开源版源码”小程序由“酱茄”基于WordPress和REST API开发,实现WordPress网站数据与小程序数据同步共享,通过简单的配置就能搭建自己的小程序。 ... ——————————...2.13、文章详情Tag功能;

    USB摄像头实时检测Apriltag的python代码树莓派ubuntu可用

    一个用 Python 实现的实时检测 apriltag 标识的程序,分为基础版和升级版,在ubuntu下连接USB摄像头就能实现实时检测,VMware虚拟机和树莓派都实测可用。 升级版的程序主要添加了以下功能: 1)在检测到标记时,输出...

    高亮显示指定Tag的部件.zip

    这通常涉及使用UG提供的开放API(应用程序接口),如UG/Open或NX Open,来编写程序,这些API提供了对UG内部数据结构和功能的访问权限。开发者可以选择C++、Python等语言进行编程,以实现自定义功能。在这个案例中,...

    织梦tag标签静态化

    7. **更新与维护**:静态化后的页面需要在内容更新后同步更新,织梦CMS通常有自动或手动更新静态页面的功能,以确保信息的及时性。 8. **安全考虑**:虽然静态化提高了效率,但也增加了大量静态文件,可能成为DDoS...

    19 Display tag library 1.2

    Display Tag 1.2版本的一个重要改进是增加了对CSV、Excel、XML和PDF等多种格式的导出支持。这使得用户能够方便地将表格数据下载到本地,以便进一步处理或分析。通过添加`export="true"`属性到`&lt;display:table&gt;`标签...

    VC2010的拼图(允许TAG标记)

    总的来说,"VC2010的拼图(允许TAG标记)"是一款结合了编程技巧与教育理念的软件作品,它的TAG功能体现了创新思维,对儿童的智力发展有着积极的促进作用。同时,这款软件的开发过程也展示了C++编程在游戏开发中的...

    16进阶 3:给 API 命令增加版本功能(1).md

    为API命令增加版本功能,一方面可以帮助开发和维护人员更好地管理服务的版本,另一方面可以为系统运营人员提供必要的运行时信息。通过合理使用Git和Go语言的ldflags工具,可以有效地实现这一目标,提高软件开发和...

    wodig4顶客程序源码

    5.后台TAG管理增加翻页功能,增加TAG分类 6.修正焦点图设置中,图片位置没有默认数值BUG 7.增加自定义TAG管理功能 8.系统标签增加文章相册视频分类 9.修改DIGG形象图片、相册图片、视频缩略图的上传方式,所有上传...

    关于tag的一个简单测试

    1. **testcase**:在软件开发中,测试用例(Test Case)是指为测试某个功能或系统特性而设计的一组条件或操作,用于验证该功能是否按预期工作。这里的"testcase"标签可能表明这个压缩包包含了一个或多个测试用例,...

    statusTags一个tag标签插件根据用户提供的模板和数据生成tags

    "statusTags"是一个基于JavaScript的tag标签插件,它旨在帮助开发者轻松地在他们的项目中实现自定义的标签功能。这个插件的核心特性是能够根据用户提供的模板和数据来动态生成标签,提供了一整套完善的管理功能,...

    新云插件 自动添加TAG

    6. "客户端":这可能是插件的安装程序或者相关应用程序,用户需要下载并安装以使用自动添加TAG的功能。 综上所述,"新云插件 自动添加TAG"是一款集自动化标签管理、内容收集和网站优化于一体的工具,配合提供的辅助...

    QCMS.rar_QC_个性化推荐_调用JS

    QCMS是一个小型网站... 增加TAG功能 7. 增加站内连接功能 8. 增加相关文章功能(根据TAG匹配) 9. 增加js站外调用标签 10.增加留言本返回IP 11.增加最新的文章调用和 热门或者推荐文章调用 12.增加SQL调用(万能标签

    j2ee网络留言板程序,包含文档

    在留言板程序中,每个功能对应一个Action,如PostAction用于处理留言发布,ViewAction用于展示留言列表。 3. **JSP(JavaServer Pages)**:JSP用于生成动态HTML,是视图层的一部分。在留言板中,JSP页面负责展示...

    myelicpse 出现Invalid location of tag的问题解决方法

    这种错误虽然不影响程序运行,但长期存在可能导致代码结构混乱,增加后期维护难度。 #### 二、具体问题分析及解决方案 ##### 1. `&lt;form&gt;`标签位置不当 **问题描述**:`&lt;form&gt;`标签只能位于`&lt;table&gt;`之外,即不能...

    CH552G 程序例子

    6. **标签**:"Tag"在这里可能是指相关的项目标签或者是分类标识,具体含义需要根据上下文确定,可能是为了区分不同类型的程序或功能。 7. **压缩包子文件的文件名称列表**:"U盘CH559IAP实现"可能是包含示例代码、...

    Tag的使用<JSP 2.0新特性>

    在JavaServer Pages (JSP) 技术中,Tag库是扩展JSP功能的重要手段,尤其是在实现可重用和模块化代码方面。JSP 2.0版本引入了一个新的特性,即自定义Tag的支持,这使得开发者能够创建自己的标签库,以更符合HTML语法...

Global site tag (gtag.js) - Google Analytics