【问题标题】:ruby on rails: how to change the routing addressruby on rails:如何更改路由地址
【发布时间】:2014-06-14 20:13:35
【问题描述】:

我是 Rails 新手,我想知道是否有办法更改路线名称。我会在一分钟内解释这句话。我有一个名为 users_controller控制器,下面是我的控制器中的代码:

def create
  if @user.save
  redirect_to @user
end

而我的 routes.rb 文件如下:

resources :users

get '/users/:id', to: 'users#show'

现在假设我有一个表格并且我填写正确,然后我将被重定向到localhost:3000/users/id(id = some value),我这样做了。现在我希望这个 URL 像 localhost:3000/registered 。那是当我单击提交按钮时,如果一切正确,我希望将 URL 视为localhost:3000/registered,这会将我带到我的显示操作,或者就像localhost:3000/users/id(id = some value) 一样工作。我不希望 ID 可见。

为此,我尝试了get 'registered', to: 'users#show',但我仍然看到与localhost:3000/users/id(id = some value) 相同的URL。请告诉我该怎么做。

这是我的表演动作

def show

@user = User.find(params[:id])

end

我尝试了另一种方法,即在同一个控制器中执行另一个操作。我在 users_controller 中创建了 index action 并执行,然后我得到了 No method Error

【问题讨论】:

  • Rails guide on routing 非常棒。
  • 我提到过。从那里我得到这个想法得到“注册”,到:'users#show'
  • 我应该将控制器更改为其他东西而不是使用@user
  • 类似 redirect_to 注册路径

标签: ruby-on-rails-4 ruby-on-rails-3.2 routes custom-routes


【解决方案1】:

您需要在用户控制器的 createupdate 操作中更改您的 redirect_to

class UsersController < ApplicationController
  def create
     # get user from params
    if @user.save
      redirect_to registered_path
    else
      render :new
    end
  end

  def update
     # get user from params
    if @user.save
      redirect_to registered_path
    else
      render :edit
    end
  end
end

编辑:正如我们在 cmets 中所讨论的,您不想使用 "users#show",因为每个用户的注册页面看起来都一样。您可以制作自己的注册控制器来执行此操作。

rails g controller registered index

【讨论】:

  • 然后它给我一个错误,你正在查看的页面在 heroku 上运行时不存在
  • 它说找不到没有 ID 的用户
  • 我认为这与我的 Show 操作有关
  • 我看到了这个问题。问题是您将registered 映射到"user#show",它需要用户的ID。您想为所有用户创建一个样板注册页面,还是希望为每个用户创建一个唯一的注册页面?
  • 我希望所有用户在登录时都能看到相同的显示页面,其中只有他们的姓名。您可以将其视为某个网站的感谢页面。
【解决方案2】:

只需将您的路由用作:

match "/registered", :to => "users#show", :as => :user_registered, via: :get

要使用此路径,您将使用

redirect_to user_registered_path(id: user_id) 

在你的方法中。

【讨论】:

  • 但是它怎么知道它是 GET 还是 POST
  • sorry my bad!最后加上这个:via: method method being get or post
  • 让我这样检查一下。 :)
  • 找不到没有 ID 的用户 :(
  • 但是当我这样做match 'users/:id', to: 'users#show', :constraints =&gt; {:id =&gt; /[A-Z]+/}, via: :get它不起作用
【解决方案3】:

最后,从我的讨论中可以看出,无法隐藏您的 ID,但我们可以更改它们在浏览器上的显示方式。一种建议的方法是为 ID 创建一个 hash 并使用它在 show action 中显示项目,或者另一种方法是重定向您对某些静态页面的操作。

【讨论】:

    猜你喜欢
    • 2015-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-01
    • 2011-04-17
    • 1970-01-01
    • 1970-01-01
    • 2013-10-09
    相关资源
    最近更新 更多