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/versionsproduct_versions_path,您仍然可以访问产品 ID 1一个名为 params[:product_id].

的变量