【问题标题】:Model associations not working Rails 3模型关联不起作用 Rails 3
【发布时间】:2012-12-01 18:54:25
【问题描述】:

这是我的联想:

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

用户模型(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

【问题讨论】:

  • 显示您如何将项目分配给用户的代码在哪里?
  • 你指的是协会吗?它们在模型中。
  • 我指的是那个特定的项目。当您定义该项目时,您应该说 project.user = User.find(1) 或类似的东西。你这样做了吗?
  • 请发布您的迁移。
  • 您需要向我们展示您是如何创建项目实例的,以便我们帮助您找出未分配 user_id 属性的原因。

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


【解决方案1】:

如果您使用约定名称,则表示您在 Project 表中有一个user_id,您不需要在 Project 模型中指定foreign_key,您只需要:

belongs_to :user

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

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

关于你的控制器,我想你有 current_user 方法,它定义了当前用户登录。所以如果你想用 user_id 与 current_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]的用户,你的用户模型没有那个属性,它是项目的属性。

【讨论】:

  • 哇甚至没想过要使用 current.user。这对我帮助太大了!!!谢谢!!!
【解决方案2】:

在迭代中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

【讨论】:

  • 这没有做到。项目的 user_id 仍然返回 nil。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多