私は以下をテストしています:
- ユーザーが投稿 (新しいページ) を作成すると、表示ページにリダイレクトされます (投稿は「公開済み」として保存されます)。
- 彼は編集ページに移動し、 [下書きを保存] ボタンをクリックすると、ショー ページに再びリダイレクトされます。
- 彼は再び編集ページに移動し、次のようなものが表示されるはずです:
<p>Status: <span>"Draft"</span></p>
(以前は<p>Status: <span>"Published"</span></p>
)
仕様:
describe "post status" do
let!(:post) { FactoryGirl.create(:post, user: user,
title: "Lorem",
content: "Lorem Ipsum",
status: "Published",
#category_id: category.id,
tag_list: "#{tag.id}") }
before do
sign_in user
visit edit_post_path(post)
end
describe "edit page" do
it { should have_selector('h1', text: "Update post") }
it { should have_selector('span', text: "Published") }
end
let(:save_draft) { "Save Draft" }
let(:publish) { "Publish" }
describe "save as draft" do
before do
click_button save_draft
visit edit_post_path(post)
end
it { should have_selector('h1', text: "Update post") }
it { should_not have_selector('span', text: "Published") }
it { should have_selector('span', text: "Draft") }
end
end
<p class="status">
<% if @post.status == "Draft" %>
Status: <span class="label"><%= @post.status %></span>
<% elsif @post.status == "Published" %>
Status: <span class="label label-primary"><%= @post.status %></span>
<% end %>
</p>
編集ページ:
<p class="status">
<% if @post.status == "Draft" %>
Status: <span class="label"><%= @post.status %></span>
<% elsif @post.status == "Published" %>
Status: <span class="label label-primary"><%= @post.status %></span>
<% end %>
</p>
動作はライブ ページで機能しますが、仕様を実行するとテストが失敗します。
失敗:
1) 投稿ページにページの投稿ステータスが表示され、下書きとして保存されます/post_pages_spec.rb:211:in `ブロック (5 レベル) in '
2) 投稿ページにページの投稿ステータスが表示され、下書きとして保存されますrequests/post_pages_spec.rb:210:in `ブロック (5 レベル) in'
仕様では、タグ内に"Published"というテキストが見つかりますが、 "Draft"は見つかりません ( "Draft"が見つかるはずです)。span
クリック ボタンが間違ったタイミングでトリガーされていませんか? それを修正する方法は?
編集:
def update
@post = Post.find(params[:id])
if @post.update_attributes(params[:post]) && params[:commit] == "Publish"
@post.update_attributes(status: "Published")
flash[:success] = "Post updated."
redirect_to @post
elsif @post.update_attributes(params[:post]) && params[:commit] == "Save Draft"
@post.update_attributes(status: "Draft")
flash[:success] = "Post draft updated."
redirect_to @post
else
render 'edit'
end
end
def create
@post = current_user.posts.build(params[:post])
if @post.save && params[:commit] == "Publish"
@post.update_attributes(status: "Published")
flash[:success] = "Post published."
redirect_to @post
elsif @post.save && params[:commit] == "Save Draft"
@post.update_attributes(status: "Draft")
flash[:success] = "Post saved as draft."
redirect_to @post
else
render 'new'
end
end