工作如何在控制器中呈现动作?

时间:2015-07-27 08:40:58

标签: ruby-on-rails ruby-on-rails-4

我在控制器中有这样的方法:

  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方法后,我当前的路径是:

  

http://localhost:3000/players

  

http://localhost:3000/players/new

但布局来自players/new。为什么? 那应该是我的考试?在测试中我只想检查用户是否在nickname提交的应用程序中输入昵称返回创建用户页面(播放器/新路径)。

1 个答案:

答案 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

你会注意到,除非你明确地传递数据,否则数据永远不会存在。

希望这有帮助。