Rails URL更改而不更改视图

时间:2017-05-12 17:24:23

标签: ruby-on-rails capybara rspec-rails

我正在测试Rails中的应用程序并且出现故障我无法弄清楚。我有一张名为" Families"具有基本的CRUD功能。在创建一个新的"家庭"在新视图中,如果未验证标题,则应该再次呈现新视图。它是。但是网址从" families / new"更改和#34;家庭。"视图和URL不匹配。而我的测试结果却失败了。为什么会在我的网址中发生这种情况?这是我的测试:

require 'rails_helper'

feature "Creating a family" do 

scenario "A user creates a family with invalid title" do 
    visit '/'
    click_link 'Create Family'
    click_button "Create"
    expect(page.current_path).to eq(new_family_path)
end

end 

以下是我的控制器中的新操作和创建操作:

def new 
    @family = Family.new
end 

def create 
    @family = Family.new(family_params)
    if @family.save
        redirect_to root_path
    else 
        flash.now[:danger] = "There was a problem"
        render :new
    end 
end

家庭模特:

class Family < ApplicationRecord

    validates :title, presence: true

end

2 个答案:

答案 0 :(得分:2)

就在这里:

def create 
  @family = Family.new(family_params)
  if @family.save
    redirect_to root_path
  else 
    flash.now[:danger] = "There was a problem"
    render :new
  end 
end

当您点击create操作时,您POSTfamilies。然后,您render :new - 离开families网址,new部分显示。

如果您希望以families/new网址结尾,则需要执行以下操作:

def create 
  @family = Family.new(family_params)
  if @family.save
    redirect_to root_path
  else 
    flash.now[:danger] = "There was a problem"
    redirect_to new_family_path
  end 
end

请记住:渲染和路由是两个独立的事情。仅仅因为render :new并不意味着您应该最终到达new_families_path网址。两件不同的事情。

答案 1 :(得分:1)

正在呈现视图,但是因为您点击了POST端点create然后呈现了new,所以POST端点就是网址​​显示的内容。

您可能不希望将其更改为重定向到此处new,因为您将丢失保存在@family对象中的数据,我假设您使用该数据来显示用户输入在表格上。

我建议您检查表单是否再次在页面上呈现或显示Flash消息,而不是确认该网址是/new