我正在尝试清理我的路由。我有一个可以登录并创建应用程序的公司模型。他们可以创造几个。
目前这是我的设置:
路线
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来阻止它。但我不觉得这是非常安全的。
答案 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/