Дружественные URL в Rails 3 - PullRequest
1 голос
/ 11 ноября 2010

Мое текущее приложение использует URL-адреса, такие как:

/ philsturgeon / philsturgeon / trip_slug

У меня есть поездки, связанные с пользователями в моей модели, например:

class Trip < ActiveRecord::Base
    belongs_to :user

    def to_param
        "#{user.username}-#{slug}"
    end
end

Теперь мне сказали о to_param, который кажется потрясающим.Это означает, что я могу использовать обычные ссылки на ресурсы:

<h4><%= link_to trip.name, trip %></h4>

вместо того, чтобы вручную создавать строки, подобные этой:

redirect_to('/' + current_user.username + '/' + @trip.slug)

Проблема в том, что я получаю разделенный дефисом (или тире) URL.Как только я изменяю URL to_param на #{user.username}/#{slug} (обратите внимание на косую черту вместо черты), я получаю сообщение об ошибке:

ActionController :: RoutingError в Home # index

Отображение/Users/phil/Scripts/ruby/travlr/app/views/home/index.html.erb, где поднята строка # 27:

Не найдено ни одного маршрута {: action => "destroy",: controller =>"trips",: id => #}

Извлеченный источник (около строки # 27):

24: <% = gravatar trip.user.email, 50%> 25: 26:27: <% = link_to trip.name, trip%> 28: 29: 30:
Пользователь:

Ответы [ 3 ]

0 голосов
/ 11 ноября 2010

Это происходит потому, что «/» имеет особое значение со ссылкой на URL.Представьте, что у вас есть файл в / Home / user / my-file и вы пытаетесь получить к нему доступ, используя file: // Home / user / my / file

Это в основном то, что вы пытаетесь сделать.Если вы хотите, чтобы «file» находился внутри «my», вам нужно хранить его там.В случае с Rails вам нужно создать вложенный ресурс .

0 голосов
/ 16 ноября 2010

Похоже, жесткое кодирование URI - единственное реальное решение в этой ситуации.Работает нормально, но не самый хороший код.

Спасибо тем, кто ответил, но они не совсем правильно.

0 голосов
/ 11 ноября 2010

Вам нужно сбежать от / до %2F.Таким образом, вы должны иметь ...

def to_param
    "#{user.username}%2F#{slug}"
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...