如何在Ruby on Rails中基于数据库数据生成多页面?
在Ruby on Rails中实现食品详情页的动态生成
1. 模型与数据库配置
如果还未创建Food模型,先执行以下命令生成模型并完成数据库迁移:
rails generate model Food image:string food_name:string price:decimal rails db:migrate
在app/models/food.rb中添加核心逻辑,用于生成友好的URL标识(slug):
class Food < ApplicationRecord validates :food_name, :price, presence: true # 自动将食品名转为URL友好的格式(如"Burger"转成"burger") before_save :generate_slug private def generate_slug self.slug = food_name.parameterize end end
为数据库添加slug字段并设置唯一索引(避免重复URL):
rails generate migration AddSlugToFoods slug:string:uniq rails db:migrate
2. 配置友好路由
在config/routes.rb中设置路由,让每个食品对应独立的URL:
# 直接生成www.foods.com/burger这类无前缀的URL get '/:slug', to: 'foods#show', as: :food # 如果需要保留前缀(如www.foods.com/foods/burger),则用资源路由: # resources :foods, param: :slug
3. 编写控制器逻辑
在app/controllers/foods_controller.rb中实现show动作,读取对应食品的数据:
class FoodsController < ApplicationController def show @food = Food.find_by(slug: params[:slug]) # 处理食品不存在的情况,返回404页面 unless @food render file: "#{Rails.root}/public/404.html", status: :not_found, layout: false end end end
4. 编写通用ERB模板
在app/views/foods/show.html.erb中编写通用模板,仅替换动态数据部分:
<div class="food-detail"> <h1><%= @food.food_name %></h1> <img src="<%= @food.image %>" alt="<%= @food.food_name %>" class="food-img"> <p class="price">价格:<%= number_to_currency(@food.price) %></p> <!-- 以下是模板的固定内容,所有页面保持一致 --> <div class="common-footer"> <p>我们承诺使用新鲜食材制作每一份食品</p> <!-- 其他通用内容 --> </div> </div>
5. 批量导入食品数据
在db/seeds.rb中添加批量数据,执行命令导入到数据库:
Food.create!([ { food_name: "Burger", price: 12.99, image: "/assets/burger.jpg" }, { food_name: "Pizza", price: 18.99, image: "/assets/pizza.jpg" }, { food_name: "Spaghetti", price: 15.99, image: "/assets/spaghetti.jpg" }, # 剩余17个食品数据依次添加 ])
执行导入命令:
rails db:seed
完成以上步骤后,每个食品都会自动生成对应的独立URL,所有页面共用同一个ERB模板,仅替换从数据库读取的图片、名称和价格信息。
内容的提问来源于stack exchange,提问作者SEVENELEVEN
相关产品推荐
相关产品推荐

