Rails redirect_to REST

时间:2011-10-06 23:31:01

标签: ruby-on-rails ruby url routing

我正在学习RoR,我喜欢到目前为止我发现的所有东西。我正在从基于PHP的CodeIgniter框架切换,我在使用 redirect_to 方法时遇到了问题。

我已经定义了一个用于处理注册的基本用户模型 - 数据在数据库中存储得很好,但问题是在将用户注册到系统后重定向时。

基本上,个人资料页面的格式如下: / users /:name /:id

我有一个路由文件定义如下:

resources :users
match '/users/:name/:id', :to => 'users#show'

这是我的创建方法

def create
  @title = "User creation"

  @user = User.new(params[:user])
  if @user.save
    info = { :name => @user.name, :id => @user.id }

    redirect_to info.merge(:action => "show")
  else
    @title = 'Sign Up'
    render 'new'
  end
end

但是,这将生成以下格式的网址:

http://localhost:3000/users/27?name=Testing

当我真正寻找这样的东西时:

http://localhost:3000/users/Testing/27

从SEO的角度来看,对于我来说,个人资料页面网址看起来就是这样。我一直在寻找互联网,但我只找到解决不同问题的方法。我希望有人可以提供帮助。

解决 Ryan建议的两个版本都运行良好,我决定坚持第二个版本,因为它感觉更加RESTful。我只是分享我现在拥有的配置 - 请注意,User模型可能不是那么正确,但它是重要的to_param函数。此外,我注意到,如果我将函数私有,它不起作用 - 这是有道理的,但我只是认为我会分享那些可能遇到这种情况的人问题

这是我的路线档案:

resources :users

这是我的用户模型:

class User < ActiveRecord::Base
  attr_accessible :name, :email

  email_regex = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i

  validates :name, 
      :presence => true,
      :length => { :within => 5..50 }

  validates :email,
      :presence => true,
      :format => { :with => email_regex},
      :uniqueness => { :case_sensitive => false }

  def to_param
    "#{id}-#{name.parameterize}"
  end
end

这是我的控制器创建功能:

def create
  @title = "User creation"

  @user = User.new(params[:user])
  if @user.save
    redirect_to @user
  else
    @title = 'Sign Up'
    render 'new'
  end
end

1 个答案:

答案 0 :(得分:3)

像这样定义你的路线:

get '/users/:name/:id', :to => 'users#show', :as => "user"

然后使用此帮助程序重定向到它:

redirect_to(user_path(@user.name, @user.id))

或者,你可以坚持使用resources :users,而不必定义自己的路线。这里的不同之处在于您的路线类似于/users/1-testing而不是users/1/testing,但优势在于您将成为更多Rails标准。

为此,请在模型中定义to_param方法,如下所示:

def to_param
  "#{id}-#{name.parameterize}
end

然后Rails将使用路由中to_param方法的输出。