如何在Rails网址中隐藏:id?

时间:2018-10-24 00:51:39

标签: ruby-on-rails ruby rails-routing

我有这些嵌套的路由,我想从网址中隐藏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部分,就可以了吗?

还是我的嵌套路由用例不正确?

2 个答案:

答案 0 :(得分:1)

gem 'friendly_id'使您可以创建漂亮的URL并使用对人友好的字符串,就好像它们是数字ID。

https://github.com/norman/friendly_id

答案 1 :(得分:1)

您有一套可能的解决方案:

  1. 如前所述,您可以将ID转换为段塞之类的东西,或者其他类似的东西,这就是其他答案所提到的:https://github.com/norman/friendly_id

  2. 您可以将所选对象的ID存储在会话cookie中。这样,客户端仍在发送相关数据,但实际上并没有出现在URL中。

  3. 您可以拥有一个临时Transaction表,您可以在其中存储第一个对象和第二个对象。这样,路由将处理transaction_id,而first_object_id和second_object_id将在表中抽象出来。这也将允许您存储与交易或交易过程相关的其他元数据。

  4. 您可以创建一个单独的端点,该端点不与shares控制器链接,在这里您可以接受两个(可选)查询参数:/sharetransaction/trade?first_object_id=113&second_object_id=106。这样,URL可以反映实际发生的情况,而不是无故更改中间的ID。

您采用的方法取决于您的用例。