2010-05-16 3 views
1

Быстрый вопрос. Вот мой код:Rails - неопределенный метод `name 'для nil: NilClass

#routes 
map.resources :customers, :has_many => [:addresses, :matchings] 
map.connect ":controller/:action/:id" 

#url path: 
http://127.0.0.1:3000/customers/index/3 

#customers controller 
def index 
    @customer = Customer.find(params[:id]) 
end 

#customers view/index.html.erb 
... 
<%= @customer.name %> 
... 

Ошибка: неопределенный метод `имя 'для nil: NilClass.

Вот мои рассуждения. Параметр: id поступает с моего URL-адреса (т. Е. Мы ищем клиента № 3 по указанному выше пути). @customer должен легко найти этот массив, а затем @ customer.name должен указать имя, но, видимо, @customer пуст. Зачем?

Я предполагаю, что проблема заключается в том, что я не создаю массив в контроллере?

------ ОБНОВЛЕНИЕ ------

Привет Ларри, большое спасибо за комментарии.

Что я имею в виду под «индексом» на самом деле является домашней страницей, на которую попадают клиенты, когда они заходят на сайт. (У меня также есть отдельные логины для других пользователей, таких как работодатели, и они идут на свой собственный индекс). В настоящее время я использую «список» в качестве списка клиентов и «шоу» для одного человека ... есть ли лучший способ?

Второе и самое важное: журналы не дают мне ответа на фундаментальную проблему, которая заключается в невозможности отображения страницы.

Processing CustomersController#index (for 127.0.0.1 at 2010-05-16 16:56:19) [GET] 
Parameters: {"action"=>"index", "id"=>"10", "controller"=>"customers"} 
... 
[4;36;1mCustomer Load (2.0ms)[0m [0;1mSELECT * FROM "customers" WHERE ("customers"."id" = 10) [0m 
[4;35;1mMatching Load (24.0ms)[0m [0mSELECT * FROM "matchings" WHERE ("matchings".customer_id = 10) [0m 
Completed in 153ms (View: 18, DB: 26) | 200 OK [http://127.0.0.1/customers/index/10] 

------ ОБНОВЛЕНИЕ # 2 (последний!) ------

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

Алекс прав - мои маршруты не выстраиваются, как им нужно. Я создал новое действие в моем контроллере клиентов Home. Это базовая база клиента при входе в систему (она не отображает информацию об одном клиенте, поэтому, вероятно, ее не следует показывать, и это не список, поэтому не должен быть индексом или списком).

Rake routes # ...gives me a list of routes that does NOT include home. Why? 

Во-вторых, если маршрут отображается имеет, например:

:action => "home" 
/customers # (instead of what I need, '/customers/:id') 

, что я должен сделать, чтобы изменить этот маршрут, чтобы принять: идентификатор?

ответ

1

Посмотрите на rake routes. Действие индекса для ресурса не совпадает с идентификатором. Я подозреваю, что Rails даже не помещает id в params для действия индекса. Как сказал Райан, вы должны использовать действие шоу для этого, а URL-адрес для действия show будет http://localhost:3000/customers/3.

Если вы собираетесь использовать ресурсы RESTful, вы, вероятно, захотите избавиться от маршрута map.connect ":controller/:action/:id" по умолчанию.

+0

Даже если «показ» вообще не показывает информацию о клиенте? Моя домашняя страница для клиента фактически отображает информацию о связанной модели, Matching. Эта модель должна «показывать» информацию как клиентам (на их целевой странице), так и работодателям (на целевой странице). Отображаемая информация отличается от каждой стороны, и каждая целевая страница показывает информацию о другой. (Заказчик: has_many: работодатели,: через =>: сопоставления). Так что я должен делать «showcustomer» и «showemployer» в соответствующем контроллере? – sscirrus

+0

@sscirrus: если вам нужно * показать действие, чтобы показать данные пользователя на другой странице, тогда обязательно используйте его для этого. В этом случае вы можете ввести дополнительное действие в пользовательском контроллере под названием «сопоставления» и использовать его для показа целевой страницы (URL будет/clients/3/matchings). В качестве альтернативы вы можете сопоставить вложенные ресурсы клиентам, которые направят один и тот же URL-адрес на действие индекса в контроллере Matchings, но я не уверен, что это возможно, если у вас есть отношение «многие ко многим» (т.е. соответствия должны быть вложенным ресурсом как у клиентов, так и у работодателей). –

0

Посмотрите в своем журнале, чтобы увидеть параметры, отправляемые вашему контроллеру и действие.

Кроме того, вы не закрываете случай, когда для вашего контроллера указан неверный идентификатор.

Например, должно быть больше как:

#customers controller 
def index 
    @customer = Customer.find(params[:id]) 
    flash[:error] = "Customer not found" and return unless @customer 
end 

Добавлено:

Также обратите внимание, что в стандартном стиле REST, индекс должен быть список клиентов. Для просмотра конкретного клиента обычно используется действие «показать».

Ваш запрос Customer.find (params [: id]) возвращает один экземпляр модели клиента или nil. Если вам нужен массив клиентов, это будет больше похоже на Customer.найти (: все)

Добавлено -

Ваш журнал показывает, что ваше действие вызывается правильно. Похоже, ваше заявление на поиск не работает. Используйте консоль и убедитесь, что Customer.find («10») дает результат, который вы ожидаете.

0

Я думаю, что вы действительно делаете запрос к действию show, а не действию index. Поместите этот код внутри действия show.

+0

Hi Ryan, У меня также есть код контроллера «index» в действии «show». Это все еще не дает мне ответа. Проверка журналов кажется, что она правильно просматривает действие индекса. – sscirrus

+0

@sscirrus: Есть ли что-нибудь еще в вашем файле маршрутов? Возможно, что-то еще вмешивается. Я также настоятельно рекомендую использовать действие show для поиска особых ресурсов. Если вы используете его для поиска вложенных ресурсов, то идентификатор клиента должен быть передан как client_id с помощью помощников вложенных маршрутов. –

Смежные вопросы