创建不显示:id的编辑URL路由

时间:2014-06-25 12:19:16

标签: ruby-on-rails

我正在尝试清理我的路由。我有一个可以登录并创建应用程序的公司模型。他们可以创造几个。

目前这是我的设置:

路线

get 'applications/edit/:id', to: 'applications#edit'

Applications_controller

def edit
 @application = current_company.applications.find(params[:id])
end 

def update
 @application = Application.find(params[:id])
 if @application.update(application_params)
  redirect_to dashboard_path
 else
  render 'edit'
 end
end

每家公司都有自己的仪表板。这是我的代码 的 /仪表板

您的有效申请

<% @applications.all.each do |f| %>
 <%= link_to "Application",   show_path + "/#{f.id}" %> | <%= link_to "Edit", edit_application_path("#{f.id}") %>
   <br>
<% end %>

现在一切正常,如果我去edit_application / 11 f.ex我看到了。

我想要更改的是从网址中删除:ID。

因此,使其更安全,并给予更好的感觉。现在我花了5分钟才意识到我可以改变:id url并编辑所有内容。因此我添加了current_company.applications来阻止它。但我不觉得这是非常安全的。

1 个答案:

答案 0 :(得分:2)

如果您要删除:id,您仍然需要一种方法来查找所需的数据。

只要您有网址/edit/12,并且只要您使用12网址中的ID GET来查找您的内容,它就会显示在浏览器栏中。 “隐藏”它的唯一方法(但它根本不是更安全,因为它很容易找到),是使用POST请求,其中包含一个包含id隐藏字段的表单(可以用JavaScript制作)。 您要求应用程序从@applications.all.each中的链接获取id,但它唯一可以做的就是将它包含在请求中的某个位置(无论是GET,POST,COOKIES / SESSION,......) 。

对于另一个(可能更好的)解决方案,请继续阅读。

一种非常常见的做法是使用slug:您为每个内容创建一个唯一的密钥,例如,如果您的标题是“我的精彩应用”,则该标题将为my-great-app。因此,您的网址没有id (如果您始终使用slugs作为参考,则无法找到它)。优点是您仍然可以快速找到您要搜索的内容(在slug上创建唯一索引)。

关于slu的一些进一步阅读:

http://rubysnippets.com/2013/02/04/rails-seo-pretty-urls-in-rails/

What is the etymology of 'slug'?