Linux中國

Rails 之旅第 2 天:Rails 關聯和拖動 div

大家好!今天是我搭建這個玩具項目的第 2 天。下面再來記錄一下關於 Rails 的一些有趣的事情吧!

目標:做一個冰箱詩歌論壇

我想做一種無聊的標準網站來學習 Rails,並且其他人可以與之互動,就像一個論壇一樣! 但如果人們真的可以在網站上打字,那就會產生各種各樣的問題(如果他們是垃圾郵件發送者怎麼辦?又或者只是言語刻薄?)。

我想到的第一個想法是,可以讓人們與網站互動,但實際上卻不能在網站上打字,那就是一個「冰箱詩歌論壇」,只給你一組固定的字,你就可以隨意組合。

所以,這就是我們的計劃!

我這個項目的目標是想知道我是否能用 Rails 來做其他的小型網路項目(而不是像我通常做的那樣,使用一些更基本的東西,比如 Flask,或者放棄後端,用 Javascript 來寫所有東西)。

怎麼把字拖來拖去呢?jQuery 的可拖放 UI!

我想讓大家能夠把文字拖動起來,但我又不想寫很多 Javascript。結果發現這超級簡單 —— 有一個 jQuery 庫可以做到,它叫做 draggable!一開始,拖動並不成功。

一開始拖動在手機上是不行的,但是有一個技巧可以讓 jQuery UI 在手機上工作,叫做 jQuery UI touch punch。下面是它的樣子(有興趣看工作原理的可以查看源碼,代碼很少)。

banana forest cake is

一個有趣的 Rails 功能:關聯

我以前從來沒有使用過關係型 ORM,對於 Rails,我很興奮的一件事就是想看看使用 Active Record 是什麼樣子的!今天我了解了 Rails 的 ORM 功能之一:關聯。如果你像我一樣對 ORM 完全不了解的話,那就來看看是怎麼回事吧。

在我的論壇中,我有:

  • 用戶
  • 話題(我本來想把它叫做「線索」,但顯然這在 Rails 中是一個保留詞,所以現在叫做「話題」)。
  • 帖子

當顯示一個帖子時,我需要顯示創建該帖子的用戶的用戶名。所以我想我可能需要寫一些代碼來載入帖子,並為每個帖子載入用戶,就像這樣(在 Rails 中,Post.whereUser.find 將會運行 SQL 語句,並將結果轉化為 Ruby 對象):

@posts = Post.where(topic_id: id)
@posts.each do |post|
    user = User.find(post.user_id)
    post.user = user
end

這還不夠好,它要為每個帖子做一次單獨的 SQL 查詢!我知道有一個更好的方法,我發現它叫做關聯。這個鏈接是來自 https://guides.rubyonrails.org 的指南,到目前為止,它對我很有幫助。

基本上我需要做的就是:

  1. User 模型中添加一行 has_many :post
  2. Post 模型中添加一行 belongs_to :user
  3. Rails 現在知道如何將這兩個表連接起來,儘管我沒有告訴它要連接到什麼列上!我認為這是因為我按照它所期望的慣例命名了 posts 表中的 user_id 列。
  4. UserTopic 做完全相同的事情(一個主題也有很多帖子:has_many :posts)。

然後我載入每一個帖子和它的關聯用戶的代碼就變成了只有一行! 就是這一行:

@posts = @topic.posts.order(created_at: :asc).preload(:user)

比起只有一行更重要的是,它不是單獨做一個查詢來獲取每個帖子的用戶,而是在 1 個查詢中獲取所有用戶。顯然,在 Rails 中,有一堆不同的方法來做類似的事情(預載入、急切載入、聯接和包含?),我還不知道這些都是什麼,但也許我以後會知道的。

一個有趣的 Rails 功能:腳手架!

Rails 有一個叫 rails 的命令行工具,它可以生成很多代碼。例如,我想添加一個 Topic 模型/控制器。我不用去想在哪裡添加所有的代碼,可以直接運行

rails generate scaffold Topic title:text

並生成了一堆代碼,這樣我已經有了基本的端點來創建/編輯/刪除主題(Topic)。例如,這是我的現在的主題控制器,其中大部分我沒有寫(我只寫了高亮的 3 行)。我可能會刪除很多內容,但是有一個起點,讓我可以擴展我想要的部分,刪除我不想要的部分,感覺還不錯。

資料庫遷移!

rails 工具還可以生成資料庫遷移! 例如,我決定要刪除帖子中的 title 欄位。

下面是我要做的:

rails generate migration RemoveTitleFromPosts title:string
rails db:migrate

就是這樣 —— 只要運行幾個命令行咒語就可以了! 我運行了幾個這樣的遷移,因為我改變了對我的資料庫模式的設想。它是相當直接的,到目前為止 —— 感覺很神奇。

當我試圖在一列中的某些欄位為空的地方添加一個「不為空」(not null)約束時,情況就變得有點有趣了 —— 遷移失敗。但我可以修復違例的記錄,並輕鬆地重新運行遷移。

今天就到這裡吧!

明天,如果我有更多的進展,也許我會把它放在互聯網上。

via: https://jvns.ca/blog/2020/11/10/day-2--rails-associations---dragging-divs-around/

作者:Julia Evans 選題:lujun9972 譯者:wxy 校對:wxy

本文由 LCTT 原創編譯,Linux中國 榮譽推出


本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    Leave a reply

    您的郵箱地址不會被公開。 必填項已用 * 標註

    這個站點使用 Akismet 來減少垃圾評論。了解你的評論數據如何被處理

    More in:Linux中國

    Linux中國

    捐贈 Let's Encrypt,共建安全的互聯網

    隨著 Mozilla、蘋果和谷歌對沃通和 StartCom 這兩家 CA 公司處罰落定,很多使用這兩家 CA 所簽發證書的網站紛紛尋求新的證書籤發商。有一個非盈利組織可以為大家提供了免費、可靠和安全的 SSL 證書服務,這就是 Let's Encrypt 項目。現在,它需要您的幫助
    Linux中國

    關於Linux防火牆iptables的面試問答

    Nishita Agarwal是Tecmint的用戶,她將分享關於她剛剛經歷的一家公司(印度的一家私人公司Pune)的面試經驗。在面試中她被問及許多不同的問題,但她是iptables方面的專家,因此她想分享這些關於iptables的問題和相應的答案給那些以後可能會進行相關面試的人。 所有的問題和相應的答案都基於Nishita Agarwal的記憶並經過了重寫。 嗨,朋友!我叫Nishita Agarwal。我已經取得了理學學士學位,我的專業集中在UNIX和它的變種(BSD,Linux)。它們一直深深的吸引著我。我在存儲方面有1年多的經驗。我正在尋求職業上的變化,並將供職於印度的P
    Linux中國

    Lets Encrypt 已被所有主流瀏覽器所信任

    旨在讓每個網站都能使用 HTTPS 加密的非贏利組織 Lets Encrypt 已經得了 IdenTrust的交叉簽名,這意味著其證書現在已經可以被所有主流的瀏覽器所信任。從這個裡程碑事件開始,訪問者訪問使用了Lets Encrypt 證書的網站不再需要特別配置就可以得到 HTTPS 安全保護了。 Lets Encrypt 的兩個中級證書 ...