【问题标题】:How work render action in controller?控制器中的渲染动作如何工作?
【发布时间】:2015-07-27 08:40:57
【问题描述】:

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

  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 提交的应用程序中输入昵称返回以创建用户页面(玩家/新路径)。

【问题讨论】:

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


    【解决方案1】:

    实际上,当出现任何错误时,它会从new 移动到create 动作,因此路径变为http://localhost:3000/players,而render 只是在此处呈现新动作的模板。现在的主要问题是为什么会这样?

    与在新操作中一样,您已将带有一些数据的表单提交给create 操作。现在,如果假设它将您发送回new 操作,那么它必须将redirect 您返回该页面,那么redirect 会做什么?它会使rails 释放您提交的所有表单数据,并且数据将永远不会保留。因此,您要做的是保留在具有 url 的 create 操作上:http://localhost:3000/players 并呈现 new 操作,这意味着 new 操作的模板(或者您可以说表单)。它不会重定向它只是将它呈现在同一个中。

    现在的问题是数据如何保持不变?数据与对象保持一致。这行@player = Player.new(player_params) 使用您在表单中传递的属性创建Player 类的新对象。现在,由于您保持相同的操作并且对象被持久化,因此表单上的数据也被持久化。

    如果你想测试它,那么在你的代码中替换这个:

    render 'new'
    

    与:

    redirect_to new_player_path
    

    并且您会注意到,除非您明确传递,否则数据将永远不会保留。

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2016-11-16
      • 1970-01-01
      • 2015-10-08
      • 1970-01-01
      • 1970-01-01
      • 2011-06-02
      • 1970-01-01
      • 1970-01-01
      • 2012-03-02
      相关资源
      最近更新 更多