将“published_at”字段添加到具有“已发布”布尔字段的Post模型

时间:2012-10-20 04:30:55

标签: ruby-on-rails model

My Post模型有一个名为“已发布”的布尔值:

schema.rb: *

  create_table "posts", :force => true do |t|
    t.string   "title"
    t.string   "content"
    t.integer  "user_id"
    t.datetime "created_at",                            :null => false
    t.datetime "updated_at",                            :null => false
    t.boolean  "published",          :default => false
  end

如果确实如此,该帖子被视为已发布,并且它会显示在用户个人资料的已发布部分中,如果为false,则会显示在草稿部分中(抱歉,但我不知道如何处理代码重复)。

posts_controller.rb:

class PostsController < ApplicationController
  before_filter :authenticate_user!, :except => [:show, :index]

  def index
    @posts = Post.all
  end

等...

users_controller.rb:

class UsersController < ApplicationController
  def index
    @users = User.all
  end

  def show
    @user = User.find(params[:id])
    @posts = @user.posts
  end

等...

_shared / posts.thml:

   <h2>Published</h2>
    <% @posts.each do |post| %>
      <% if post.published? %>
        <div id="post-<%= post.id %>" class="post">
          <%= image_tag post.image.url(:medium) %>
          <h2 class="post-title"><%= link_to post.title, post %></h2>
          <%= link_to post.user.email, post.user %>
          <p><%= post.content %></p>
        </div>
      <% end %>
    <% end %>

    <h2>Draft</h2>
    <% @posts.each do |post| %>
      <% if not post.published? %>
        <div id="post-<%= post.id %>" class="post">
          <%= image_tag post.image.url(:medium) %>
          <h2 class="post-title"><%= link_to post.title, post %></h2>
          <%= link_to post.user.email, post.user %>
          <p><%= post.content %></p>
        </div>
      <% end %>
    <% end %>

示例:

users.html.erb:

<h2>User Show</h2>
<%= image_tag @user.avatar.url(:medium) %>
<span>Email: <%= @user.email %></span><br />
<span>ID: <%= @user.id %></span><br />

<%= render 'shared/posts' %>

index.html.erb

<%= render 'shared/posts' %>

(我知道这些观点有点混乱。我想稍后我会在每个帖子草稿旁边显示一个说“草稿”的文字。)

问题是帖子将按其created_at日期排序。我希望它们在帖子的索引页面中按published_at日期排序(我认为这更有意义)。

我知道如何通过迁移添加published_at t.datetime字段。但是我不确定在published_at字段中使用什么代码用于逻辑。

有什么建议吗?

(顺便说一下,听起来更正确?'published_at'或'published_on'?)

2 个答案:

答案 0 :(得分:4)

在表published_at(日期时间)字段中添加。当您发布时,然后更新published_at字段,然后在获取数据时使用order('published_at Desc')

@posts =  @users.posts.order('published_at DESC')

逻辑就像你的控制器一样

if params[:post][:published] == true # whatever you got in controller rather than params[:post][:published]
   @post.published_at = Time.now
else
  @post.published_at = ""
end

这意味着,当published值为true时,上面的代码会在您的控制器和在published_at字段中执行时添加值Time.now,如果发布的值为false,则上面的代码不会执行{{1} }字段有空白值。

或者,使用类似

的模型
published_at

答案 1 :(得分:1)

您应该可以调整控制器:

def show
  @user      = User.find(params[:id])
  posts      = @user.posts.order('published_at').group_by(&:published)
  @published = posts[true]
  @drafts    = posts[false]
end

然后,您可以使用@published@drafts来制作您的列表。如果您想要最先发布的那些,那么:

posts = @user.posts.order('published_at desc').group_by(&:published)