2014-09-11 2 views
1

У меня есть эта проблема: enter image description hereBELONGS_TO не работает должным образом

И у меня есть этот код:

user.rb:

class User < ActiveRecord::Base 
    # Include default devise modules. Others available are: 
    # :confirmable, :lockable, :timeoutable and :omniauthable 
    devise :database_authenticatable, :registerable, 
     :recoverable, :rememberable, :trackable, :validatable 

    def full_name 
    "lalalala" 
    end 
end 

status.rb:

class Status < ActiveRecord::Base 

    belongs_to :user 
end 

show.html.erb:

<p id="notice"><%= notice %></p> 

<p> 
    <strong>Name:</strong> 
    <%= @status.user.full_name %> 
</p> 

<p> 
    <strong>Content:</strong> 
    <%= @status.content %> 
</p> 

<%= link_to 'Edit', edit_status_path(@status) %> | 
<%= link_to 'Back', statuses_path %> 

Что мне здесь не хватает? Я не могу получить доступ к методу full_name, но я не знаю почему. Я новичок в Ruby-on-Rails, поэтому это должна быть какая-то простая деталь, которую я не понимаю. рельс версия: 4.1.5; ruby version: 2.1.2

ответ

3

Далее на комментарий Marek «s, вы также хотите посмотреть на использование метода .delegate, чтобы предотвратить Law Of Demeter (имеющий более чем одну„точку“, чтобы вызвать метод):

#app/models/status.rb 
class Status < ActiveRecord::Base 
    belongs_to :user 
    delegate :full_name, to: :user, prefix: true 
end 

Это даст вам возможность вызова:

@status.user_full_name 

Достоверность

Как Marek сказал, что у вас, вероятно, не будет объекта user, связанного с вашим status.

Чтобы определить, является ли это проблема, вы хотите использовать conditional statement, чтобы проверить, если user объект действительно существует перед вызовом:

<%= @status.user_full_name if @status.user.present? %> 

Это даст вам возможность вызова ассоциированная user объект присутствует

+1

1 + .., чтобы позволить новое, что нужно знать .. –

4

У вас есть все, что вам нужно в сообщении об ошибке. Ваша запись Status не имеет связи User запись, поэтому @status.user возвращает nil.

0

у вас нет прав пользователя, связанные с @status

<%= @status.user.try(:full_name) %> 

выше не будет возникать ошибка, если пользователь не связан с ним.

2

Все вышеприведенные ответы могут решить вашу проблему. Но есть много проблем, с которыми вы можете столкнуться из-за вашего текущего кода.

Немногие вещи, которые я нашел, что создает вопрос:

1-й: Вы получаете @status.user к нулю. Это означает, что ваш столбец user_id (он должен быть там) в состоянии, которое не установлено должным образом. Поэтому сначала установите это, а затем используйте вышеприведенное решение, чтобы спасти вас от ошибки.

2nd: Вы не указали какие-либо отношения в своей модели состояния.Вы должны иметь has_many :statuses или has_one :status в вашей модели пользователя.

3rd: Чтобы убедиться, что в таблице состояния правильно указан столбец user_id. попытаться создать его, как показано ниже:

, если у вас есть has_one соотношение:

@user_object.status.create(status_params) 

, если у вас есть has_many соотношение: `.delegate` метод

@user_object.statuses.create(status_params) 
Смежные вопросы