2013-03-25 4 views
1

Я создал новое приложение Rails. Он полностью свежий только с одной моделью пользователя (которая создается через Devise) и модель Post, которая создается с помощью эшафота. В модели Post у меня есть столбец в базе данных, который называется user_id.Рельсы с дизайном: проблемы с ассоциациями

Проблема в том, что user_id в таблице Post всегда nil (он не будет изменен на user_id пользователя, который публикует). Я подозреваю, что это имеет какое-то отношение к Devise, но я не совсем уверен. Любые предложения о том, что делать?

user.rb

class User < ActiveRecord::Base 
    devise :database_authenticatable, :registerable, 
     :recoverable, :rememberable, :trackable, :validatable 

    attr_accessible :email, :password, :password_confirmation, :remember_me 

    has_many :posts, dependent: :destroy 
end 

post.rb

class Post < ActiveRecord::Base 
    attr_accessible :title, :user_id 
    belongs_to :user 
end 

Gemfile

source 'https://rubygems.org' 

gem 'rails', '3.2.13' 
gem 'bootstrap-sass', '2.1' 
gem 'devise' 

group :development do 
    gem 'sqlite3', '1.3.5' 
end 

group :assets do 
    gem 'sass-rails', '3.2.5' 
    gem 'coffee-rails', '3.2.2' 

    gem 'uglifier', '1.2.3' 
end 

gem 'jquery-rails', '2.0.2' 

group :production do 
    gem 'pg', '0.12.2' 
end 

gem 'will_paginate', '> 3.0' 

post_controller (создать)

def create 
    @post = Post.new(params[:post]) 

    respond_to do |format| 
     if @post.save 
     format.html { redirect_to @post, notice: 'Post was successfully created.' } 
     format.json { render json: @post, status: :created, location: @post } 
     else 
     format.html { render action: "new" } 
     format.json { render json: @post.errors, status: :unprocessable_entity } 
     end 
    end 
    end 
+0

Показать свой метод 'PostController # create' –

+0

Вы присваиваете что-либо полю user_id? Вы можете получить идентификатор текущего пользователя от current_user.id – chrisbulmer

+0

Добавлен метод создания. Как его назначить - в методе создания (как)? – allegutta

ответ

3

Я предполагаю, что атрибут user_id не получает набор, потому что вы не устанавливая его. :)

def create 
    @post = Post.new(params[:post]) 
    @post.user_id = current_user.id # You need to add this line 

    respond_to do |format| 
     if @post.save 
     format.html { redirect_to @post, notice: 'Post was successfully created.' } 
     format.json { render json: @post, status: :created, location: @post } 
     else 
     format.html { render action: "new" } 
     format.json { render json: @post.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

Примечание стороны: я бы рекомендовал положить не-нулевое ограничение на post.user_id, а также (если вы еще не сделали) внешнего ключа от post.user_id к user.id. Эти ограничения помогают как предотвратить, так и легко диагностировать эти проблемы.

+0

Хотя я позаботился о «автомате» с 'has_many' и' own_to'. Но это не так? Мне нужно написать эту строку вручную? – allegutta

+0

'has_many' и' belongs_to' позволят вам делать удобные вещи, такие как 'user.posts' и' post.user', но единственный способ установить атрибут - либо установить его в форме, либо установить в другом месте, например контроллер. –

+0

Кстати, вы очень хорошо могли бы задать 'user_id' сообщения в форме, как со скрытым полем. Я стараюсь избегать этого, хотя, поскольку опытный достаточно tinkerer мог изменить значение 'user_id' скрытого поля на какой-то другой идентификатор пользователя, а затем ваш пост будет сохранен для неправильного пользователя. Конечно, это не гигантская проблема безопасности в этом конкретном случае, но, вероятно, это хорошая привычка практиковать в целом. –

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