如何在rails中创建设计用户模型和新模型之间的关联?

时间:2015-06-29 02:37:34

标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-4 devise

我可以轻松地在我的应用程序中执行singnin和singup过程,但我无法理解如何在我的新模型中传递user_id。成功集成设计后,我按照以下步骤操作:

使用书名

生成新模型
rails generate model books name:string users:references

它在book文件夹中生成了models个类以及migration类。

模型类

class Book < ActiveRecord::Base
 belongs_to :user
end

迁移类

class CreateBooks < ActiveRecord::Migration
 def change
  create_table :books do |t|
  t.string :name
  t.references :user, index: true, foreign_key: true
  t.timestamps null: false
  end
end

现在,我添加

has_many :books, :dependent => :destroy

user模型类中进行正确的one to many关联。

创建这些类后,我运行rake db:migrate并在项目中创建了一个新模式。创建模式后,我写了seed文件来确认我的数据库是否正常工作。它工作正常。我可以在Bookuser表格中看到新条目以及user_id表格中的Book

路线类

sampleApplicationUI::Application.routes.draw do
 devise_for :users
 resources :books, except: [:edit]
end

现在,我添加了一个book_controller类,这里是代码:

书籍控制器类

class BooksController < ApplicationController
before_action :authenticate_user!

 def index
  @book = Book.all
 end

def new
 @book = Book.new
end

def create
 @book = Book.new(filtered_params)
 if @book.save
   redirect_to action: 'index'
 else
   render 'new'
 end
end

private
def filtered_params
 params.require(:book).permit(:name, :user_id)
end
....

书籍/ new.html.erb

<%= form_for @book, as: :book, url: book_path do |f|  %>

<div class="form-group">
  <%= f.label :Name %>
  <div class="row">
    <div class="col-sm-2">
      <%= f.text_field :name, class: 'form-control' %>
    </div>
  </div>
</div>

  <div class="row">
  <div class="col-sm-6">
    <%= f.submit 'Submit', class: 'btn btn-primary' %>
  </div>
</div>
  

我关注了一些博客,他们提到要在book_controller类中进行以下更改以访问user_id并保存到book表中:

书籍控制器类中的

更改
def new
  @book = Book.new(user: current_user)
end

但在这里我得到No variable defined current_user :(

请告诉我这里的错误以及如何在user.user_id课程中访问book controller

谢谢你的时间!

2 个答案:

答案 0 :(得分:1)

在控制器的创建方法

中尝试此操作

图书管理员课程

def create
 @book = current_user.books.build(filtered_params)
 if @book.save
   redirect_to action: 'index'
 else
   render 'new'
 end
end

希望这对你有用。

答案 1 :(得分:0)

在books / new.html.erb中,在&lt;%= f.submit ____%&gt;之前添加以下行:

<%= f.hidden_field :user_id, value: current_user.id %>