我在控制器中有这样的方法:
def create
@player = Player.new(player_params)
if @player.save
flash[:success] = "Player created"
redirect_to player_path(@player)
else
render 'new'
end
end
我也测试过:
it "add players without nickname" do
visit new_player_path
click_button "Add player"
current_path should eq new_player_path
end
但是在调用render
方法后,我当前的路径是:
不
但布局来自players/new
。为什么?
那应该是我的考试?在测试中我只想检查用户是否在nickname
提交的应用程序中输入昵称返回创建用户页面(播放器/新路径)。
答案 0 :(得分:0)
实际上当出现任何错误时,它会从new
移动到create
操作,因此路径变为http://localhost:3000/players,而render
只会呈现新操作&#39 ; s模板在这里。现在主要的问题是为什么呢?
在新操作中,您已将包含一些数据的表单提交给create
操作。现在,如果它假设它将您发送回new
操作,那么您必须redirect
返回该页面,那么redirect
会做什么?它会使rails丢失您提交的所有表单数据,并且数据永远不会存在。因此,您所做的就是保留create
行动,其中包含网址:http://localhost:3000/players并呈现new
行动,这意味着new
行动的模板(或者你可以说形式)。它不会重定向它只是将它呈现在同一个中。
现在问题是数据如何持续存在?数据与对象持续存在。这一行@player = Player.new(player_params)
使用您在表单中传递的属性创建Player
类的新对象。现在,当您保持相同的操作并且对象被持久化时,表单上的数据也会保持不变。
如果你想测试它,那么在你的代码中替换它:
render 'new'
使用:
redirect_to new_player_path
你会注意到,除非你明确地传递数据,否则数据永远不会存在。
希望这有帮助。