0

我有三个模型:“用户”、“出版物”和“线程”。用户和线程是对象,发布是连接(使用 has_many :through)。

当用户创建一个新线程时,线程及其连接(发布)都会成功创建——这很棒。唯一的问题是,user_id 在两者中都是空的。

作为参考,我正在使用设计。

以下是我的用户模型:

class User < ActiveRecord::Base

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

    attr_accessible :email, :password, :password_confirmation, 
                    :remember_me, :username, :profile_image, 
                    :first_name, :last_name

    has_many :publications
    has_many :threads, :through => :publications

end

以下是我的出版物模型:

class Publication < ActiveRecord::Base
  attr_accessible :thread_id, :user_id
  belongs_to :thread
  belongs_to :user
end

下面是我的线程模型:

class Thread < ActiveRecord::Base
  attr_accessible :description, :name, :tag_list, :thumbnail_image, :status, :thread_type, :subtitle, :summary

  has_one :publication
  has_one :user, :through => :publication

end

下面是我用来创建新线程的表单:

= form_for [@user, @thread] do |f|
  - if @thread.errors.any?
    #error_explanation
      %h2= "#{pluralize(@thread.errors.count, "error")} prohibited this thread from being saved:"
      %ul
        - @thread.errors.full_messages.each do |msg|
          %li= msg

  .field
    %span Title:
    = f.text_field :name

  .actions
    = f.submit 'Submit'    

下面是我在线程控制器中的创建操作:

def create
  @user = User.find(params[:user_id])
  @thread = @user.threads.new(params[:thread])
  @thread.build_publication
end

以下是出版物表:

class CreatePublications < ActiveRecord::Migration
  def change
    create_table :publications do |t|
      t.integer :user_id
      t.integer :thread_id

      t.timestamps
    end
  end
end

所有对象都成功创建,我似乎无法让 user_id 通过。

4

1 回答 1

1

我相信你的线程控制器的创建动作需要稍微改变:

def create
  @user = User.find(params[:user_id])
  @thread = @user.threads.create(params[:thread])
  @thread.build_publication
end

您会注意到该操作的第二行现在使用create而不是new. 该create命令将创建一个新线程并保存它。

于 2013-06-29T23:18:30.130 回答