2013-06-07 2 views
0

Im обучения Rails, и мне просто интересно, правильно ли я написал код, который я написал. У меня две модели: пользовательская и постмодельная. Сообщения принадлежат пользователям, поэтому я хочу передать user_id автоматически для публикации при создании объекта. Я использовал метод assign_attributes в пост-контроллере, чтобы установить user_id с помощью помощника current_user, предоставленного приложением. Ниже мой соответствующий код. Опять же, я хочу знать, правильно ли это или если есть лучший способ сделать это.Установка значения по умолчанию при создании нового объекта модели

def create 
@post = Post.new(params[:post]) 
@post.assign_attributes({:user_id => current_user.id}) 

end 

Сообщение Модель

class Post < ActiveRecord::Base 

attr_accessible :content, :title, :user_id 

validates :content, :title, :presence => true 

belongs_to :user 

end 

модель пользователя

class User < ActiveRecord::Base 

devise :database_authenticatable, :registerable, 
    :recoverable, :rememberable, :trackable, :validatable 

# Setup accessible (or protected) attributes for your model 
attr_accessible :email, :password, :password_confirmation, :remember_me 


has_many :posts 

end 

ответ

2

Вы довольно близко. Поскольку у вас 1) был предоставлен помощник удобства current_user от Devise и 2) сконфигурированы User и Post как отношение has_many/belongs_to, имеет смысл создать новое сообщение, а затем добавить его в current_user. Затем в вашей модели Post вы захотите разбить валидации для отдельных атрибутов - то, как вы перечислили, :content, :title в последовательности не будет работать.

# app/controllers/posts_controller.rb 
def create 
    post = Post.create(params[:post]) 
    current_user.posts << post 
end 

# app/models/post.rb 
class Post < ActiveRecord::Base 

    attr_accessible :content, :title, :user_id 

    validates :content, :presence => true 
    validates :title, :presence => true 

    belongs_to :user 
end 
+0

«current_user.posts << @post» ... Как это работает? Добавляем новый объект к массиву user.posts? Но как передается значение для user_id? –

+0

Точно - 'post' добавляется к' current_user'. 'user_id' больше не нужно передавать явно, потому что связь внешнего ключа между' post' и 'current_user' автоматически создается при добавлении сообщения к текущему пользователю. Такое реляционное сопоставление является лишь одним из удобств что ActiveRecord дает. – zeantsoi

+0

Также обратите внимание, что я удалил '@' перед 'post'. Поскольку метод' create' (скорее всего) не будет отображать представление, нет необходимости назначать переменную экземпляра ... локальная переменная будет достаточной и (очень номинально) уменьшить распределение памяти. – zeantsoi

0

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

В routes.rb

resources :users do 
    resources :posts 
end 

Сделав это, вы теперь будете ссылаться на сообщения как @ user.post. Я уже показал пример в this question.

+0

Я знаю, что это сработает, но я не хочу вставлять эти маршруты. –

0

Я хотел бы сказать что-то вроде этого:

def create 
    params[:post][:user_id] = current_user.id 
    @post = Post.new(params[:post]) 
    @post.save 
end 

или

def create 
    @post = Post.new(params[:post]) 
    @post.user = current_user 
    if @post.save 
    ... 
    else 
    ... 
    end 
end 

или

def create 
    @post = @post.new(params[:post]) 
    @post.user_id = current_user.id 
    @post.save 
end 

Вы можете поставить user_id в Params, но это не будет безопасно. user_id не должен находиться в 'attr_accessable', поэтому он будет защищен для mass_assignment.

+0

Это хорошо выглядит. –