在Ruby on Rails中创建草稿状态

时间:2013-07-21 01:38:50

标签: ruby-on-rails

(强制我是编码确认的新手)

我用Rails创建了一个简单的博客应用程序,并为我的表单使用了simple_for gem。我正在尝试使用两个提交按钮创建草稿状态。最终目标是让“发布”按钮具有登录或未登录索引页面的所有用户所看到的帖子,并且“另存为草稿”按钮将仅允许登录的用户查看帖子。这是我到目前为止所拥有的。

_form.html.erb:

<div class="actions">
<p><%= f.submit "Publish", :name => "publish" %>
<%= f.submit "Save as Draft", :name => "draft" %></p>   </div>

posts_controller.rb :(不确定要放在这里的内容)

def create
    @post = current_user.posts.new(params[:post])


    respond_to do |format|
      if @post.save 
        format.html { redirect_to @post, notice: 'Post was successfully created.' }
        format.json { render json: @post, status: :created, location: @post }
      else
        format.html { render action: "new" }
        format.json { render json: @post.errors, status: :unprocessable_entity }
      end
    end
  end

index.html.erb :(不确定如何指定使用不同值提交的帖子)

   <% @posts.reverse_each do |post| %>
      <h1 style="font-family: latohairline"><%= link_to post.title, post %></h1>
        <p style="margin-top: -20px"><small>Posted by <%= post.user.name %></small></p>
        <p><%= post.description.html_safe %></p>

        <% if user_signed_in? %>
          <div><p><small><%= link_to 'Edit', edit_post_path(post) %> |
          <%= link_to 'Delete', post, method: :delete, data: { confirm: 'Are you sure?' } %></small></p></div>
        <% else %>
        <% end %>

post.rb :(不确定是否需要在模型中更改任何内容,但包括它以防万一)

class Post < ActiveRecord::Base
    validates_uniqueness_of :title
    def to_param
      [id, title.parameterize].join("-")
    end
  attr_accessible :description, :title, :image

  validates :user_id, presence: true
  validates :description, presence: true


  belongs_to :user
  has_attached_file :image


end

任何帮助都会受到赞赏,我一直在谷歌搜索几个小时,但不知道所有正确的搜索条件我最终得到了zilch。谢谢!

2 个答案:

答案 0 :(得分:4)

如果您对同一表单使用多个提交按钮,则必须选中params[:commit]。这将设置为提交按钮的名称,因此在您的控制器中,您可以检查

if params[:commit] == 'draft'
  # save as a draft
else
  # save as published
end

您是否也对如何将每个帖子归类为草稿感到困惑?我可能只是在你的模型上制作布尔字段,然后根据它制作一些范围:

scope :drafts, -> { where(draft: true) }
scope :published, -> { where(draft: false) }

因此,保存为草稿只意味着您将draft设置为true。然后,您可以使用Post.draftsPost.published检索任一设置,以便在适当的时候显示它们。

答案 1 :(得分:2)

草稿逻辑最终会变得非常复杂,特别是如果您想在最初发布后跟踪草稿更新。 (假设我发布了一条记录,然后开始编辑它,我不想发布它。)

如果您想尝试一下,我已经开始将草稿逻辑提取到名为Draftsman的Ruby gem中。

我总是乐于回答问题或收到有关如何改善问题的建议的反馈。草稿是我项目的重要组成部分,所以我希望这个API很好!