1

アプリに投稿を作成できるユーザー モデル (エージェント) があります。ダッシュボードからこれを行うことができます。また、ダッシュボード内に既存の投稿をすべて表示します。エラーが発生することを確認するためにテストしているコンテンツのない新しい投稿を作成しようとすると、問題が発生します。コンテンツを含む投稿の作成は機能しますが、コンテンツを含まない投稿を作成すると、@posts インスタンス変数が nil であるというエラーが引き続き発生します。私が何かを逃したかどうかわからないのですか?

ダッシュボード ビュー:

.container
    .column.span9

      - if current_agent
        = render 'home/shared/agent_post_panel'
        = render 'home/shared/agent_dashboard_tabs'

agent_dashboard_tabs:

  .tabs-container
    #posts
      .content
        - if @posts.any? //This is where the error is triggered
          = render partial: 'shared/post', collection: @posts

ダッシュボードのコントローラー:

class HomeController < ApplicationController
  before_filter :authenticate!, only: [:dashboard]

  def index
  end

  def dashboard
    if current_agent
      @post  = current_agent.posts.build
      @posts = current_agent.posts
    end
  end
end

私のポストコントローラー:

class PostsController < ApplicationController
  before_filter :authenticate_agent!


  def create
    @post = current_agent.posts.build(params[:post])
    if @post.save
      flash[:notice] = "Post created!"
      redirect_to dashboard_path
    else
      flash[:error] = "Post not created"
      render 'home/dashboard'
    end
  end

end

テスト:

feature 'Creating posts' do

  let(:agent) { FactoryGirl.create(:agent) }

  before do
    sign_in_as!(agent)
    visit dashboard_path
  end

  scenario "creating a post with valid content" do
    fill_in 'post_content', :with => 'I love donuts'
    expect { click_button "Post" }.to change(Post, :count).by(1)
  end

  scenario "creating a post with invalid content" do
    expect { click_button "Post" }.not_to change(Post, :count)
    click_button "Post"
    page.should have_content("Post not created")
    page.should have_content("can't be blank")
  end
4

3 に答える 3

2

投稿にエラーがある場合、home/dashboard内部からレンダリングしていますが、変数を設定していません。posts#create@posts

これを前に追加する必要がありますrender 'home/dashboard'

@posts = current_agent.posts
于 2013-05-07T12:14:37.937 に答える
0

redirect_to dashboard_pathの代わりに使用しrender 'home/dashboard'ます。keepまた、で flash のメソッドを呼び出すことで、ダッシュボードに flash メッセージを保持できますhome#dashboard

flash.keep
于 2013-05-07T12:23:18.097 に答える
0

あなたの質問を正しく理解できれば、ページの読み込みに問題があります (HomeController#index)

index アクションをロードする前にわかるように、ユーザーがログインしているかどうかを確認します。

アプリケーションフローが入っていることを確認してください

if current_agent
      #make sure you application flow comes here
      @post  = current_agent.posts.build
      @posts = current_agent.posts
end

そうでない場合は、このフローを次のように少し変更することをお勧めします (これが要件に適合する場合)。

if current_agent
          @post  = current_agent.posts.build
          @posts = current_agent.posts
else
    @post = Post.new
    @posts = []
end

そして最後に、try取得したオブジェクトについてよくわからない場合は、常に使用するのが良いです

if @posts.try(:any?)
于 2013-05-07T12:47:24.880 に答える