gpt4 book ai didi

mysql - rails 3 关系模型的脚手架

转载 作者:IT老高 更新时间:2023-10-29 00:05:07 24 4
gpt4 key购买 nike

是否有任何教程如何搭建使用多对多关系的简单模型?

最佳答案

我在 Rails 3.0.5 上使用 ruby​​ 1.9.2 一步一步创建下面的 testapp 时写的。另请参阅我使用的 gem 的“Gemfile”(整个 Testapp 可下载,链接位于第 15 部分的末尾)。所以这里是:

1) 去一个你想创建一个测试应用程序的地方,然后

rails new mynewtestapp
cd mynewtestapp

2) 然后添加 2 个具有 has_and_belongs_to_many 关联的模型
rails g scaffold book title:string author:string
rails g scaffold user name:string age:integer

3) 然后您需要为该关联创建连接表...默认情况下,rails 将查找名称由两个按字母顺序关联的表的名称组成的表...所以让我们创建一个迁移来创建这样一个 table
rails g migration createBooksUsers

4)打开生成的迁移文件,此时看起来像
class CreateBooksUsers < ActiveRecord::Migration
def self.up
end

def self.down
end
end

5)修改它看起来像这样
class CreateBooksUsers < ActiveRecord::Migration
def self.up
create_table :books_users, :id => false do |t|
t.integer :book_id
t.integer :user_id
end
end

def self.down
drop_table :books_users
end
end

6)在book和user模型中添加has_and_belongs_to_many关联,以及关联添加的新id

应用程序/模型/book.rb
class Book < ActiveRecord::Base
attr_accessible :title, :author, :user_ids
has_and_belongs_to_many :users
end

应用程序/模型/用户.rb
class User < ActiveRecord::Base
attr_accessible: :name, :age, :book_ids
has_and_belongs_to_many :books
end

7)现在我们的模型和迁移已经完成……让我们创建表
rake db:create
rake db:migrate

(如果您使用 sqlite3 或者如果您创建了要手动使用的数据库,那么 create 可能不是必需的,此示例将使用 sqlite 工作,因此我没有添加任何与安装数据库管理系统相关的内容。但是因为有很多实际上所有值得使用的东西都有很好的文档记录,你会很快找到任何帮助)

8) 现在决定将哪个对象分配给哪个对象......当然你可以两种方式都这样做......我会保持简单并向一个人演示......假设你只有几个用户并且想将这些分配给书籍...

在这一点上,我想说让我们得到一些外部帮助,就像建议的二进制 x ……但为了简单起见,我会选择 simple_form gem 而不是 Formtastic。我想每个人都有自己的最爱......但是 simple_form 似乎给你更多的自由来根据你的意愿对整个输出进行 css 样式......所以让我们在这一点上安装 simple_form,就这样做
echo "gem 'simple_form', :git => 'git://github.com/plataformatec/simple_form.git'" >> Gemfile

将 simple_form 添加到您的 Gemfile,然后运行
bundle install

并通过以下方式将简单的表单安装到您的应用程序中(即生成配置、默认样式和语言文件)
rails g simple_form:install

9) 修改我们的书籍表格的时间

现在的书籍形式应该是这样的

app/views/books/_form.html.erb
01    <%= form_for(@book) do |f| %>
02 <% if @book.errors.any? %>
03 <div id="error_explanation">
04 <h2><%= pluralize(@book.errors.count, "error") %> prohibited this book from being saved:</h2>
05
06 <ul>
07 <% @book.errors.full_messages.each do |msg| %>
08 <li><%= msg %></li>
09 <% end %>
10 </ul>
11 </div>
12 <% end %>
13
14 <div class="field">
15 <%= f.label :title %><br />
16 <%= f.text_field :title %>
17 </div>
18 <div class="field">
19 <%= f.label :author %><br />
20 <%= f.text_field :author %>
21 </div>
22 <div class="actions">
23 <%= f.submit %>
24 </div>
25 <% end %>

使用 simple_form,我们可以只替换上面的一些代码(第 1 和 14 - 24 行),这样整个文件看起来像这样:
01    <%= simple_form_for(@book) do |f| %>
02 <% if @book.errors.any? %>
03 <div id="error_explanation">
04 <h2><%= pluralize(@book.errors.count, "error") %> prohibited this book from being saved:</h2>
05
06 <ul>
07 <% @book.errors.full_messages.each do |msg| %>
08 <li><%= msg %></li>
09 <% end %>
10 </ul>
11 </div>
12 <% end %>
13
14 <%= f.input :title %>
15 <%= f.input :author %>
16 <%= f.association :users %>
17
18 <%= f.button :submit %>
19
20 <% end %>

10) 现在您可能想要启动您的应用程序
rails s

添加一些用户,然后添加一本书,然后就有了你的第一个 has_and_belongs_to_many 表单:
first simple_form form without special effects

11) 好吧,这可能还不是最漂亮的东西,但是添加一个简单的样式表会有所帮助……创建一个新文件
public/stylesheets/simple_form.css

并将以下几行粘贴到其中
/* public/stylesheets/simple_form.css */
.simple_form label {
float: left;
width: 100px;
text-align: right;
margin: 2px 10px;
}

.simple_form div.input {
margin-bottom: 10px;
}

.simple_form div.boolean, .simple_form input[type='submit'] {
margin-left: 120px;
}

.simple_form div.boolean label, .simple_form label.collection_radio, .simple_form label.collection_check_boxes{
float: none;
margin: 0;
}

.simple_form .error {
clear: left;
margin-left: 120px;
font-size: 12px;
color: #D00;
display: block;
}

.simple_form .hint {
clear: left;
margin-left: 120px;
font-size: 12px;
color: #555;
display: block;
font-style: italic;
}

然后重新加载页面并...... Tadaa......第一次罢工......
after adding a default simple_form stylesheet

12) 如果你不喜欢多选列表框,就回到书本形式

app/views/books/_form.html.erb

并修改行
15      <%= f.input :author %>

稍微到
15      <%= f.input :author, :as => :check_boxes %>

从列表框中制作复选框......但是...... ewww......看看这个:
left to right checkbox display

13) 有些东西似乎有点不对劲……众所周知,从左到右的选项显示会时不时地给 simple_form 新手带来麻烦,但实际上这是一个很容易解决的问题

除了这个小格式问题之外,您可能还想在大括号中看到他名字后面的用户年龄,例如“汤姆 (25)”

...所以让我们做 3 个快速修复

a) 在 config/initializers/simple_form.rb 中取消注释并设置 2 个选项,以便用 div 包装每个复选框并将复选框集放置在字段集内
  # You can wrap a collection of radio/check boxes in a pre-defined tag, defaulting to none.
config.collection_wrapper_tag = :fieldset

# You can wrap each item in a collection of radio/check boxes with a tag, defaulting to none.
config.item_wrapper_tag = :div

b) 稍微修改我们的 simple_form.css 样式表,如添加:
fieldset { border: 0; }

...除非你更喜欢围绕字段集的丑陋的大边框

c) 在我们的用户模型中创建方法 'to_label',因为默认情况下,'to_label' 是 simple_form 寻找的第一个方法,以获得字符串表示来显示对象。由于一个奇怪的事件,我们的模型用户有一个名为“名称”的列。由于名称也是 simple_form 在模型中查找的方法,我们很幸运这个应用程序到目前为止已经运行。如果我们改为调用 name 列 forename,Rails 将不会列出用户名,而是列出默认的 ruby​​-object 表示(例如 <#User:521369846>)。猜猜我们很幸运;-)

应用程序/模型/user.rb
class User < ActiveRecord::Base
has_and_belongs_to_many :users

def to_label
"#{name} (#{age})"
end

end

并且编辑表单看起来很漂亮......
nice and cozy edit view

14)现在只有show view需要显示书主了……也不太难,打开show-view就可以了

应用程序/ View /书籍/show.html.erb

并添加第 13-16 行以显示书主:
01    <p id="notice"><%= notice %></p>
02
03 <p>
04 <b>Title:</b>
05 <%= @book.title %>
06 </p>
07
08 <p>
09 <b>Author:</b>
10 <%= @book.author %>
11 </p>
12
13 <p>
14 <b>Who owns a copy?</b>
15 <%= @book.users.map {|x| x.to_label}.join ', ' %>
16 </p>
17
18 <%= link_to 'Edit', edit_book_path(@book) %> |
19 <%= link_to 'Back', books_path %>

最后但并非最不重要的......节目 View
Who owns a book?

15) 好吧,关于 habtm 的快速教程或用单词 has_and_belongs_to_many 在 rails 中的关联就这么多了。我已经把我在网上写这篇文章时创建的测试应用程序放在
https://1drv.ms/u/s!Alpu50oGtUZq7AiJkL08QqBiMAjb

关于mysql - rails 3 关系模型的脚手架,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5384203/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com