Rails redirect_to REST - PullRequest
       1

Rails redirect_to REST

2 голосов
/ 07 октября 2011

Я нахожусь в процессе изучения RoR, и мне нравится все, что я открываю до сих пор.Я переключаюсь с платформы CodeIgniter на основе PHP, и у меня возникает проблема с использованием метода redirect_to .

Я определил базовую модель Users, которую я использую для обработки регистрации- данные отлично сохраняются в БД, но проблема заключается в перенаправлении после регистрации пользователя в системе.

По сути, страница профиля имеет следующий формат: / 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

Однако это сгенерирует URL следующего формата:

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

Когда я на самом деле ищу что-то вроде этого:

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

Это просто имеет смысл для меня с точки зрения SEOс точки зрения, что URL страницы профиля выглядит так.Я искал интер-сети, но я только нахожу решения различных проблем.Я надеюсь, что кто-то может помочь.

решено Обе версии, предложенные Райаном, работали нормально, и я решил придерживаться второй, так как она кажется более RESTful.Я просто поделюсь конфигом, который у меня есть сейчас - учтите, модель User может быть не совсем правильной, но важна функция to_param.Кроме того, я заметил, что это не работает, если я сделаю функцию private - это имеет смысл, но я просто подумал, что поделюсь этим для кого-то, кто может столкнуться с такой проблемой.

Вот мой файл маршрутов:

resources :users

А вот моя модель 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

А вот мой контроллер create function:

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 Ответ

3 голосов
/ 07 октября 2011

Определите свой маршрут следующим образом:

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 в ваших маршрутах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...