在博文中添加账户信息
至此,博文还没有关联上作者信息,这像什么话,不行不行!再来看看博文模型,我们将开始通过增加新的迁移来将作者账户添加到博文中:
sample_blog $ padrino g migration AddAccountToPost account_id:integer => Located unlocked Gemfile for development create db/migrate/003_add_account_to_post.rb
上述指令创建了一个包含了期望字段的迁移,将account_id附加到博文中。
修改一下迁移文件,将现有博文都指派给系统的第一位用户(现在也就一个用户噻):
# db/migrate/003_add_account_to_post.rb class AddAccountToPost < ActiveRecord::Migration def self.up change_table :posts do |t| t.integer :account_id end # and assigns a user to all existing posts first_account = Account.first Post.all.each { |p| p.update_attribute(:account, first_account) } end # ... end
现在,我们回到博文模型来创建账户关联并增加点儿验证:
# app/models/post.rb class Post < ActiveRecord::Base belongs_to :account validates_presence_of :title validates_presence_of :body end
亲,每次修改数据库都要记得迁移人家哦:
sample_blog $ padrino rake ar:migrate == AddAccountToPost: migrating =============================================== -- change_table(:posts) == AddAccountToPost: migrated (0.0009s) ====================================== 7:04 => Executing Rake ar:migrate ...
我们的博文现在已经有了适当的关联和验证,接下来我们需要进入Padrino管理系统做一点儿改动来包含账户和博文。
直奔admin/controllers/posts.rb,将current_account添加到新博文的创建中:
# admin/controllers/posts.rb Admin.controllers :posts do # ... post :create do @post = Post.new(params[:post]) @post.account = current_account if @post.save flash[:notice] = '恭喜,博文已成功创建!' redirect url(:posts, :edit, :id => @post.id) else render 'posts/new' end end # ... end
同时还要更新博文的视图来显示作者信息和其它改动:
# app/views/posts/show.haml - @title = @post.title #show .post .title= @post.title .date= time_ago_in_words(@post.created_at || Time.now) + ' ago' .body= simple_format(@post.body) .details .author Posted by #{@post.account.email} %p= link_to '查看全部博文', url_for(:posts, :index)
# app/views/posts/_post.haml .post .title= link_to post.title, url_for(:posts, :show, :id => post) .date= time_ago_in_words(post.created_at || Time.now) + ' ago' .body= simple_format(post.body) .details .author 由#{post.account.email}发布
现在来增加一个新用户。到:3000/admin,切换到Account分页并创建一条新的账户记录。一旦你有了新的账户,尝试用它登录并添加一些新的博文。猜猜这样会发生什么?这样你就有了多个用户和多篇博文:D
到:3000/posts看看效果,博文和作者分别全都链接上了。
站点布局现在,应用已经正确配置并且服务器也跑起来了,我们继续来创建一些基本的样式和布局。
首先,我们为应用创建一个布局。布局是在其路由上扮演内容模板容器角色的文件,它会被用来为应用创建各个结构一致的页面。要想创建布局,只需要简单地想app/views/layouts目录添加文件:
# app/views/layouts/application.haml !!! Strict %html %head %title= [@title, "Padrino 示例博客"].compact.join(" | ") = stylesheet_link_tag 'reset', 'application' = javascript_include_tag 'jquery', 'application' = yield_content :include %body #header %h1 Sample Padrino Blog %ul.menu %li= link_to '博客', url_for(:posts, :index) %li= link_to '关于', url_for(:about) #container #main= yield #sidebar - form_tag url_for(:posts, :index), :method => 'get' do Search for: = text_field_tag 'query', :value => params[:query] = submit_tag 'Search' %p Recent Posts %ul.bulleted %li Item 1 - Lorem ipsum dolorum itsum estem %li Item 2 - Lorem ipsum dolorum itsum estem %li Item 3 - Lorem ipsum dolorum itsum estem %p Categories %ul.bulleted %li Item 1 - Lorem ipsum dolorum itsum estem %li Item 2 - Lorem ipsum dolorum itsum estem %li Item 3 - Lorem ipsum dolorum itsum estem %p Latest Comments %ul.bulleted %li Item 1 - Lorem ipsum dolorum itsum estem %li Item 2 - Lorem ipsum dolorum itsum estem %li Item 3 - Lorem ipsum dolorum itsum estem #footer Copyright (c) 2009-2013 Padrino
这个布局为博客创建了一个基本结构,并引用了对控制行为和显示而言必要的样式表和JavaScript文件。这个布局应该包含一些假元素,比如假的搜索框和列表项。
然后,我们仅仅需要为演示建立两张样式表。第一张是被艾里克·迈耶斯(Eric Meyers)重置的通用CSS,可以在示例博客仓库找到完整的样式表重置并放到public/stylesheets/reset.css。
第二张是为了博客更酷一点儿的应用样式表,可以从示例博客仓库找到该样式表的完整内容并放置到app/stylesheets/application.sass。
有了布局和样式表,博客终于拿得出手了!让我们访问:3000/posts来看看新的界面。