📜  redirect_back fallback_location root_path rspec (1)

📅  最后修改于: 2023-12-03 14:47:02.627000             🧑  作者: Mango

介绍

redirect_back 是 Rails 自带的一个方法,可以用于在控制器中进行重定向。通过该方法,我们可以将请求重定向到之前访问的页面,也可以指定一个备用路径作为重定向的目标。

fallback_locationroot_path 都是 redirect_back 方法的参数。fallback_location 参数指的是如果无法获取之前访问的页面地址,那么重定向的目标就会变成 fallback_location 参数指定的路径;而 root_path 是一个帮助方法,可以返回网站的根路径。

rspec 是一个 Ruby 的测试框架,可以用来进行单元测试、功能测试和集成测试。

在 Rails 项目中,我们可以使用 RSpec 编写测试代码,对我们的应用进行测试。并且,通过 RSpec 中提供的 getpost 等方法,我们可以模拟用户的行为,测试我们应用的控制器和视图是否正常运行。

使用
控制器中使用

在控制器中,我们可以使用 redirect_back 方法进行重定向。

def create
  @post = Post.create(post_params)
  if @post.save
    redirect_back(fallback_location: root_path)
  else
    render 'new'
  end
end

上面的代码中,如果保存成功,就通过 redirect_back 方法返回之前访问的页面或根路径;否则,就渲染 'new' 视图。

测试中使用

在 RSpec 的测试中,我们可以使用 get, post, put 等方法访问控制器中的方法。

RSpec.describe PostsController, type: :controller do
  describe "POST #create" do
    context "with valid params" do
      it "redirects to the show page" do
        post :create, params: { post: { title: "Hello World", content: "This is my first post." } }
        expect(response).to redirect_to(post_path(Post.last))
      end
    end

    context "with invalid params" do
      it "renders the new template" do
        post :create, params: { post: { title: "Hello World", content: nil } }
        expect(response).to render_template("new")
      end
    end
  end
end

上述代码中,我们先将参数传递到指定控制器上的方法中(这里是 post :create),然后通过 expect 方法进行断言。

在第一个测试中,我们期望该方法通过创建保存了一个新的帖子对象,并将页面重定向到帖子页面。因此,我们会断言该请求的响应(即 response)是一个重定向到最后一个保存的 post 对象页面的重定向。

在第二个测试中,我们期望使用无效的参数创建新的对象时,该方法应该渲染新视图。因此,我们断言该请求的响应是一个渲染到 "new" 模板的重定向。