我有这些嵌套的路由,我想从网址中隐藏Bundler could not find compatible versions for gem "actionpack":
In Gemfile:
rails (~> 5.2.0) was resolved to 5.2.0, which depends on
actionpack (= 5.2.0)
simple_form (~> 3.0.2) was resolved to 3.0.4, which depends on
actionpack (~> 4.0)
Bundler could not find compatible versions for gem "rails":
In Gemfile:
rails (~> 5.2.0)
Could not find gem 'rails (~> 5.2.0)' in any of the sources.
参数。
source 'https://rubygems.org'
git_source(:github) { |repo| "https://github.com/#{repo}.git" }
ruby '2.5.1'
gem 'rails', '~> 5.2.0'
gem 'sqlite3'
gem 'puma', '~> 3.11'
gem 'sass-rails', '~> 5.0'
gem 'uglifier', '>= 1.3.0'
gem 'coffee-rails', '~> 4.2'
gem 'turbolinks', '~> 5'
gem 'jbuilder', '~> 2.5'
gem 'devise', '~> 3.4.1'
gem 'simple_form', '~> 3.0.2'
gem 'haml', '~> 4.0.5'
gem 'bootsnap', '>= 1.1.0', require: false
group :development, :test do
gem 'byebug', platforms: [:mri, :mingw, :x64_mingw]
end
group :development do
gem 'web-console', '>= 3.3.0'
gem 'listen', '>= 3.0.5', '< 3.2'
gem 'spring'
gem 'spring-watcher-listen', '~> 2.0.0'
end
group :test do
gem 'capybara', '>= 2.15', '< 4.0'
gem 'selenium-webdriver'
gem 'chromedriver-helper'
end
gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]
每个页面上都有一个id
,看起来像这样:
resources :shares, only: [:index, :create, :update] do
resource :wizard, path: "trade" do
get :first_object
get :second_object
get :confirmation
post :validate_step
end
end
因此,用户将form_for
添加到向导中,并被重定向到以下URL:<%= form_for [@object, @trade_wizard], as: :trade_wizard, url: validate_step_share_wizard_path(@object) do |f| %>
。添加first_object
(显然与第一个不同)之后,用户将重定向到/shares/113/trade/second_object
。我不确定这是否表示潜在的安全违规,并且我的测试似乎还可以,所以我想如果我找到某种方法来隐藏URL的ID部分,就可以了吗?
还是我的嵌套路由用例不正确?
答案 0 :(得分:1)
gem 'friendly_id'
使您可以创建漂亮的URL并使用对人友好的字符串,就好像它们是数字ID。
答案 1 :(得分:1)
您有一套可能的解决方案:
如前所述,您可以将ID转换为段塞之类的东西,或者其他类似的东西,这就是其他答案所提到的:https://github.com/norman/friendly_id
您可以将所选对象的ID存储在会话cookie中。这样,客户端仍在发送相关数据,但实际上并没有出现在URL中。
您可以拥有一个临时Transaction
表,您可以在其中存储第一个对象和第二个对象。这样,路由将处理transaction_id,而first_object_id和second_object_id将在表中抽象出来。这也将允许您存储与交易或交易过程相关的其他元数据。
您可以创建一个单独的端点,该端点不与shares
控制器链接,在这里您可以接受两个(可选)查询参数:/sharetransaction/trade?first_object_id=113&second_object_id=106
。这样,URL可以反映实际发生的情况,而不是无故更改中间的ID。
您采用的方法取决于您的用例。