📅  最后修改于: 2023-12-03 14:47:02.627000             🧑  作者: Mango
redirect_back
是 Rails 自带的一个方法,可以用于在控制器中进行重定向。通过该方法,我们可以将请求重定向到之前访问的页面,也可以指定一个备用路径作为重定向的目标。
fallback_location
和 root_path
都是 redirect_back
方法的参数。fallback_location
参数指的是如果无法获取之前访问的页面地址,那么重定向的目标就会变成 fallback_location
参数指定的路径;而 root_path
是一个帮助方法,可以返回网站的根路径。
rspec
是一个 Ruby 的测试框架,可以用来进行单元测试、功能测试和集成测试。
在 Rails 项目中,我们可以使用 RSpec 编写测试代码,对我们的应用进行测试。并且,通过 RSpec 中提供的 get
、post
等方法,我们可以模拟用户的行为,测试我们应用的控制器和视图是否正常运行。
在控制器中,我们可以使用 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" 模板的重定向。