如何在子模型中添加父模型ID

时间:2018-10-12 03:56:51

标签: ruby-on-rails ruby activerecord

当我创建新的项目记录时,我想在child(“ Projects”)中放置parent(在这种情况下,是“ Users”)ID。

也许代码无法获取ID。 你能教我什么不足的问题吗?

控制器

#users_controllers.rb
def create
  @user = User.new(name:params[:name])
  @user.save
  redirect_to("/")
end 

    #projects_controllers.rb

 12   def create
 13     @user = User.find_by(id: params[:id])
 14     Project.new(
 15       name: params[:name],
 16       user_id: params[:id])
 17   end

模型

#user.rb    
class User < ApplicationRecord
  has_many :projects
end

#project.rb
class Project < ApplicationRecord
  belongs_to :user, optional: true
end

查看

#users.new.html.erb
<%= form_tag("/users", :method => :post) do %>
  <input name="name" value="<%= %>">
  <input type="submit" value="Registration">
<% end %>

#projects.new.html.erb
<%= form_tag(user_projects_path, :method => :post) do %>
  <input name="name" value= "" >
  <input type="submit" value="Create">
<% end %>   

路由

#routes.rb
Rails.application.routes.draw do
  root 'users#index'
  resources :users do
    resources :projects, shallow: true
  end
end

2.0.0-p643 :001 > User.column_names
 => ["id", "name", "created_at", "updated_at"] 
2.0.0-p643 :002 > Project.column_names
 => ["id", "name", "created_at", "updated_at", "user_id"] 

1 个答案:

答案 0 :(得分:1)

在您看来,您需要在表单路径中传递用户,例如:user_projects_path(@user)

但是,如果要将其链接到已登录的用户,那么传递用户ID并不是一个好主意,您可以直接从会话中获得该ID,因此可以在控制器中使用类似的方法:

#projects_controllers.rb
def create
  current_user.projects.new(name: params[:name])
end

如果您的控制器中没有current_user方法,则您可能在会话中存储了用户ID,在这种情况下,您的创建操作可能如下所示:

def create
  user = User.find_by(id: session[:user_id])
  user.projects.new(name: params[:name])
end