Как обращаться с этими ресурсами - PullRequest
1 голос
/ 06 февраля 2012

У меня возникла ситуация, когда у меня есть 10 ресурсов (контроллеров), которые соответствуют 10 записям базы данных.В частности, речь идет о зданиях.Имеется контроллер city_center, контроллер лесопилки и многое другое.

Я не хотел создавать контроллер_положения зданий и обрабатывать там все, так как каждое здание ведет себя по-разному.

Но у меня есть вопрос помаршруты и как справиться с конкретной ситуацией.В идеале я хотел бы, чтобы URL были такими:

/town_center/view
/sawmill/view

Это нормально, но у меня есть фундаментальная проблема.Нет простого способа получить идентификационный номер town_center из URL.Мне, конечно, понадобится эта информация, чтобы получить информацию о модели конкретного здания.Теперь можно утверждать, что я могу просто использовать это:

/town_center/view/1
/sawmill/view/2

Что кажется нормальным, но создает другую фундаментальную проблему, а именно, что мне нужно указать идентификатор, когда я перенаправляю с другого контроллера.Скажите, что я хочу перенаправить на контроллер town_center.Мне нужно было бы сделать:

redirect_to town_center_url(1)

Что мне действительно не нравится, потому что идентификатор может измениться в любое время в моей базе данных и, как правило, это плохая практика программирования, очень подверженная ошибкам.

Как бы вы справились с этим?Мне не хватает более простого способа?

РЕДАКТИРОВАТЬ:

ПРИМЕРНЫЕ МАРШРУТЫ С ИДЕИ НЕОБХОДИМОСТИ

  scope :path => '/town_center', :controller => :town_center do
    get '/view/:id' => :view, :as => 'town_center'
  end

  scope :path => '/sawmill', :controller => :sawmill do
    get '/view/:id' => :view, :as => 'sawmill'
  end

ПРИМЕР ИСПОЛЬЗОВАНИЯ

Начиная с / обзор, мысм. список строительных ссылок, таких как:

/town_center/view/1
/sawmill/view/2

Если щелкнуть первый элемент, будет выполнено действие просмотра с идентификатором: 1.Хорошо до сих пор.Но скажем, что в этом шаблоне представления есть действие типа send_message.Теперь это действие выглядит так:

def send_message
   send_the_message_blah_blah
   redirect_to sawmill_url(2)
end

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

def send_message
   send_the_message_blah_blah
   redirect_to sawmill_url(Building.where(:name=>'sawmill').first)
end 

И если я этого не сделаювообще включите: id в url, тогда мое действие просмотра просто не знает, на какое здание оно должно ссылаться.

Ответы [ 3 ]

1 голос
/ 07 февраля 2012

Так что, если бы это был я, я бы изменил свой routes и поставил before_filter в каждом контроллере, который выполняет запрос за вас.

Так что каждый из ваших routes будет выглядетьчто-то вроде этого.

scope :path => '/sawmill', :controller => :sawmill do
  get '/view' => :view, :as => 'sawmill'
end

тогда в вашем SawmillController вы добавите фильтр before, чтобы получить sawmill из базы данных.

class SawmillController < ApplicationController
  before_filter :get_sawmill
  ...
private
  def get_sawmill
    @sawmill = Building.where(:name=>'sawmill').first
  end
end

Таким образом, в любое времядействие на контроллере, они даже не будут знать, что за ним есть база данных.Контроллер выполняет всю работу ПОСЛЕ запроса.

Таким образом, вы полностью исключаете :id из вашего URL и _url методов.Значение просто sawmill_url вместо sawmill_url(1), и ваш URL будет /sawmill/view.Красиво и чисто!

0 голосов
/ 06 февраля 2012

Это заставляет меня думать, что вы не понимаете, как rails хочет, чтобы вы что-то делали, или что в вашей ситуации есть некоторые особые соображения, о которых мы до сих пор не знаем:

(редактировать: глядя на историю ваших ответов, кажется, что вы знаете о рельсах гораздо больше, чем я, поэтому я предполагаю, что это второе. Пожалуйста, пропустите до конца этого вопроса для моей просьбы о вас)

redirect_to town_center_url (1) Что мне действительно не нравится, потому что идентификатор может измениться в любое время в моем базы данных и вообще плохая практика программирования, конечно, очень подвержен ошибкам.

Единственное известное мне решение для доступа к ресурсу без какого-либо идентификатора - через некоторую другую контекстную информацию. Например, с системой аутентификации devise вы никогда нигде не используете свой идентификатор. Если вы аутентифицированы, то сервер знает, кто вы, и не хочет выдавать ваш идентификатор без необходимости в URL или где-либо еще. Точно так же, если кто-то вошел в систему, вы можете идентифицировать его ресурсы через их сеанс.

пример контроллера (вероятно, он должен быть в городской модели):

@tc = current_user.town_center
@b = current_user.barracks

вид

<%= link_to 'Town Center', @tc %> <%# which still is using some identifier %>

Или, если у вас есть «местоположение», вы можете идентифицировать одинокий town_center через местоположение, аналогичное указанному выше (но теперь вам нужен идентификатор местоположения).

Обычно, если у вас нет особого контекста, вам понадобится идентификатор где-нибудь.

Если это не поможет, я думаю, что вы должны показать нам один пример того, как вы хотели бы, чтобы все работало с нуля (пользователь заходит на вашу страницу. Что они видят?) До ... как-то открывается ресурс здания (когда здание изначально становится доступным?) для ... выполнения каких-либо действий с этим зданием.

0 голосов
/ 06 февраля 2012
match '/town_center/view/:id' => 'town_center#view'

, если у вас есть действие просмотра в вашем контроллере, но почему вы боретесь с соглашением?просто наберите:

resources :town_center

вы бы назвали town_center (instance_of_a_town_center), который бы дал вам путь

/ town_center / 1

зачем вам нужен вид?это просто метод get для экземпляра town_center в контроллере town_center.

надеюсь, это поможет

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