模型关联不工作Rails 3

时间:2012-12-01 18:54:26

标签: ruby-on-rails-3 model associations

以下是我的协会:

  • 由于用户有很多项目
  • 项目属于一个用户

用户模型(user.rb)

  class User < ActiveRecord::Base
     has_many :projects
     attr_accessible: :available, :department, :name, :skills, :title, :photo
  end

项目模式(project.rb)

  class Project < ActiveRecord::Base
     belongs_to :user, :foreign_key => :user_id
     attr_accessible :project_name
  end

这是我的show.erb.html文件中的代码

  <%= @user.projects.each do |project| %>
    <p><%= projects.project_name %></p>
  <% end %>

但这只显示两个括号,如“[]”。这让我觉得它是一个空阵列。

因此,当我在rails控制台中运行Project.find(1)以查看项目是否与用户关联时,它会吐出:

   => #<Project id: 2, project_name: "This is a project. ", created_at: "2012-11-12 02:29:28", updated_at: "2012-11-12 02:29:28", user_id: nil> 

用户ID为零?是什么给了什么?!

任何人都知道我做错了什么?谢谢!

编辑:

以下是添加外键的迁移:

  class AddForeignKeyToProjects < ActiveRecord::Migration
    def change
      add_column :projects, :user_id, :integer
    end
  end

编辑2

以下是控制器中的实例(这可能是问题)

项目控制器

  def new
    @project = Project.new(params[:project], params[:user_id])   
  end

用户控制器

  def show
    @user = User.find(params[:id], params[:project_name])

    respond_to do |format|
       format.html # show.html.erb
       format.json { render json: @user }
    end
  end

2 个答案:

答案 0 :(得分:1)

在迭代project中,您的目标不是projects

<%= @user.projects.each do |project| %>
  <p><%= project.project_name %></p>
<% end %>

---以下是将项目分配给用户的例子--- ---在这个代码我用户捐赠和成员,虽然相同的想法---

donation = Donation.new(amount: random_value.to_c,
                          date_given: Random.date(1000).to_date,
                          donation_type: ['tithes', 'offering', 'undisclosed', 'building-fund'].sample)
  member = Member.all.sample
  donation.member= member
  donation.save

答案 1 :(得分:1)

如果您使用了常规名称,则表示您在项目表格中有user_id,您无需在项目foreign_key >模型,你只需要:

belongs_to :user

我不确定这是不是你的错字:

<%= projects.project_name %> should be <%= project.project_name %>

关于你的控制器,我想你有current_user方法,它定义当前登录的用户。所以如果你想创建一个与current_user的id相关联的user_id的新项目,你应该编写这样的代码:

def new
  @project = current_user.projects.build # Create new project with user_id = current_user.id
end

如果您要创建新项目,您的create操作会喜欢这样:

def create
  @project = current_user.projects.create(params[:project])

  if @project.save # save project success
    # do some thing
  else
    # do some thing
  end
end

这些是我可以告诉你的基本动作,因为我不知道你是如何建立表格的,以及你的路线是怎样的。

当您向用户显示时,如果您使用了RESTful路线,则您的路线将如下所示:

`abc.com/users/:id/show`

什么是RESTful路线?如果您想知道,请查看此Recource routing

然后,如果您想查找用户,可以使用params[:id]

def show
  @user = User.find(params[:id])
  respond_to do |format|
    format.html # show.html.erb
    format.json { render json: @user }
  end
end

您找不到params[:project_name]的用户,您的用户模型没有该属性,它是项目的属性。