Rails 在呈现操作 "new" 时验证失败后不保留 URL 参数
Rails isn't preserving URL parameters after validation fails when the action "new" is rendered
当我用这个 URL 创建产品时
http://localhost:3000/versions/new?product_id=1
并且验证失败,Rails 没有将 product_id 保留在 URL
中
我明白了 URL
http://localhost:3000/versions
我需要该参数来按产品和 "back" 等链接保留过滤器,但我不想使用 "session" 或 "redirect" 来执行此操作。
我不明白为什么 Rails 不保留 URL。我以前使用过 CakePHP 的表单、参数和验证,我确信我没有遇到那个问题。
def create
@version = Version.new(version_params)
respond_to do |format|
if @version.save
format.html { redirect_to @version, notice: I18n.t('controllers.versions.created_successfully', default: 'Version was successfully created.') }
format.json { render :show, status: :created, location: @version }
else
format.html { render :new }
format.json { render json: @version.errors, status: :unprocessable_entity }
end
end
end
谢谢。
让我先解释一下为什么会这样
表单发布到 versions_path
即 /versions
,当验证失败时,rails(默认情况下)不会重定向回来,而是在同一路径内呈现,就像你说的 /versions
,你可以从 this guide.
找到更多关于 CRUD 路由的信息
在你的情况下,我认为它更适合 create a nested resource,所以 url 会更像这样 /products/1/versions/new
,
在路线文件中它看起来像这样
resources :products
resources :versions
end
这样当验证失败时,您将被重定向到将映射到 /products/1/versions
的 product_versions_path
,您仍然可以访问产品 ID 1
一个名为 params[:product_id]
.
的变量
当我用这个 URL 创建产品时 http://localhost:3000/versions/new?product_id=1 并且验证失败,Rails 没有将 product_id 保留在 URL
中我明白了 URL http://localhost:3000/versions
我需要该参数来按产品和 "back" 等链接保留过滤器,但我不想使用 "session" 或 "redirect" 来执行此操作。
我不明白为什么 Rails 不保留 URL。我以前使用过 CakePHP 的表单、参数和验证,我确信我没有遇到那个问题。
def create
@version = Version.new(version_params)
respond_to do |format|
if @version.save
format.html { redirect_to @version, notice: I18n.t('controllers.versions.created_successfully', default: 'Version was successfully created.') }
format.json { render :show, status: :created, location: @version }
else
format.html { render :new }
format.json { render json: @version.errors, status: :unprocessable_entity }
end
end
end
谢谢。
让我先解释一下为什么会这样
表单发布到 versions_path
即 /versions
,当验证失败时,rails(默认情况下)不会重定向回来,而是在同一路径内呈现,就像你说的 /versions
,你可以从 this guide.
在你的情况下,我认为它更适合 create a nested resource,所以 url 会更像这样 /products/1/versions/new
,
在路线文件中它看起来像这样
resources :products
resources :versions
end
这样当验证失败时,您将被重定向到将映射到 /products/1/versions
的 product_versions_path
,您仍然可以访问产品 ID 1
一个名为 params[:product_id]
.