1

我的应用中有一个可以创建帖子的用户模型(代理)。他们可以从仪表板执行此操作。我还在他们的仪表板中显示了他们所有现有的帖子。当试图创建一个没有我正在测试以确保它呈现错误的内容的新帖子时,问题就出现了。创建一个包含内容的帖子是可行的,但创建一个没有内容的帖子会不断触发一个错误,即我的@posts 实例变量为零。不确定我是否错过了什么?

仪表板视图:

.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'. 您可以通过调用keepflash in 方法在仪表板上保留 flash 消息home#dashboard

flash.keep
于 2013-05-07T12:23:18.097 回答
0

如果我正确理解您的问题,您在加载页面时遇到问题(HomeController#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 回答