我是Rails和Web编程的新手,希望你能帮我解决我的第一个项目。 我正在为房地产中介开发一个网站。
我的数据库中有3个表( Homes :Home_ID,Home_Name,Admin_ID; 管理员:Admin_ID,Admin_Name,Admin_Email; 图片: Image_ID,Image_Path,Image_Name,Home_ID,Admin_ID)。
所有3张桌子都是使用脚手架创建的。已在SQLite中输入图像信息(name,path,image_id,home_id等)。 我在网站上正确显示了不同房屋的所有文字信息,但图片除外。
我尝试在视图/ home / index.html.erb中链接它会产生以下错误:
undefined method `image_path' for #<Home:0xb63d85e0>
我使用下面的代码:
<% @homes.each do |home| %>
<tr>
<td><%= home.name %></td>
<td><%= home.details %></td>
<td><%= home.region %></td>
<td><%= home.address %></td>
<td><%= home.price %></td>
<td><%= home.admin_id %></td>
<td><%= home.image_path %></td>
</tr>
<% end %>
</table>
看起来在SQLite中输入的数据不会与rails同步。 你知道我做错了什么以及如何解决它?
谢谢。
答案 0 :(得分:0)
正在发生的事情是您正在循环查看Home表中的一系列记录。因此,当你打电话
<td><%= home.image_path %></td>
它无法识别属性image_path
,因为您没有image_path
作为Home表的列。您的列只有Home_ID,Home_Name,Admin_ID。您将不得不研究模型之间的关联,以便弄清楚如何获取每个主记录的image_path
。您可以启动here。
如果您稍后更新代码,我将很乐意发表评论。
答案 1 :(得分:0)
如果我错了,我的图像和家庭模型之间的关系将是如此正确,我不是肯定的,但我猜测家庭会有很多图像。每张图片都属于一个家。它是否正确?如果是这样,您需要在模型中声明如下:
模型/ home.rb
has_many :images
模型/ image.rb
belongs_to :home
然后,您需要将其添加到图像数据库中:
t.integer "home_id"
您可以通过转到命令行并输入:
来添加它rails g migration AddHomeToImages home_id:integer
您应该查看db / migrate /,然后查看最新的迁移文件,并确保它看起来像这样:
add_column :images, :home_id, :integer
然后运行:
rake db:migrate
此时,您只需更新控制器和视图即可显示此关联。如果这有帮助,请告诉我,如果是这样,我会帮助您处理控制器和视图。
答案 2 :(得分:0)
我认为这里最好的解决方案是使用paperclip gem。 您可以查看这个非常古老的railscast电子邮件,了解它的工作原理:
http://railscasts.com/episodes/134-paperclip
这是github存储库:
https://github.com/thoughtbot/paperclip
Paperclip将帮助您处理图像的路径,样式和预览。
答案 3 :(得分:0)
谢谢Jason,
我同意这对新手来说有点大,但要求是我们建立了一个我们需要从/向数据库读写的网站。我们通过合作伙伴关系对rails进行了快速介绍,现在我们已经独立完成并且“失去了一点时间”。
以下是我收到的错误消息:
Homes中的NameError #index
未定义的局部变量或方法`image'for
&LT;#:0xb62f7aa4&GT;
提取的来源(第20行):
17: <% @homes.each do |home| %>
18: <tr>
19: <td><%= home.name %></td>
20: <td><%= image.home_id %></td>
21: <td><%= home.details %></td>
22: <td><%= home.region %></td>
23: <td><%= home.address %></td>
当我创建数据库表时,我在homes表中有一个Image_ID,但我被告知我不需要它,并且在images表中只有Home_ID就足够了。
我知道错误是由于image.home_id引起的。 你有什么意见?我应该将Image_ID添加回homes表以显示相应home_id的所有图像,还是有另一种方式?我希望能够决定哪些图片将作为主图片显示,哪些图片将作为较小的图片显示。
以下是我使用的代码:
<强>模型/ home.rb 强>
class Home < ActiveRecord::Base
attr_accessible :address, :admin_id, :details, :name, :price, :region
has_many :images
end
<强>模型/ image.rb 强>
class Image < ActiveRecord::Base
attr_accessible :image_description, :image_name, :image_path
belongs_to :home
end
<强>视图/舍/ index.html.erb 强>
<h1>Listing homes</h1>
<table>
<tr>
<th>Name</th>
<th>Image</th>
<th>Details</th>
<th>Region</th>
<th>Address</th>
<th>Price</th>
<th>Admin</th>
<th></th>
<th></th>
<th></th>
</tr>
<% @homes.each do |home| %>
<tr>
<td><%= home.name %></td>
<td><%= image.home_id %></td>
<td><%= home.details %></td>
<td><%= home.region %></td>
<td><%= home.address %></td>
<td><%= home.price %></td>
<td><%= home.admin_id %></td>
<td><%= link_to 'Show', home %></td>
<td><%= link_to 'Edit', edit_home_path(home) %></td>
<td><%= link_to 'Destroy', home, method: :delete, data: { confirm: 'Are you sure?' } %></td>
</tr>
<% end %>
</table>
<br />
<%= link_to 'New Home', new_home_path %>
<强>视图/舍/ show.html.erb 强>
<p id="notice"><%= notice %></p>
<p>
<b>Name:</b>
<%= @home.name %>
</p>
<p>
<b>Image:</b>
<%= @image.home_id %>
</p>
<p>
<b>Details:</b>
<%= @home.details %>
</p>
<p>
<b>Region:</b>
<%= @home.region %>
</p>
<p>
<b>Address:</b>
<%= @home.address %>
</p>
<p>
<b>Price:</b>
<%= @home.price %>
</p>
<p>
<b>Admin:</b>
<%= @home.admin_id %>
</p>
<%= link_to 'Edit', edit_home_path(@home) %> |
<%= link_to 'Back', homes_path %>
<强>视图/图像/ _form.html.erb 强>
<%= form_for(@image) do |f| %>
<% if @image.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(@image.errors.count, "error") %> prohibited this image from being saved:</h2>
<ul>
<% @image.errors.full_messages.each do |msg| %>
<li><%= msg %></li>
<% end %>
</ul>
</div>
<% end %>
<div class="field">
<%= f.label :image_name %><br />
<%= f.text_field :image_name %>
</div>
<div class="field">
<%= f.label :image_path %><br />
<%= f.text_field :image_path %>
</div>
<div class="field">
<%= f.label :image_description %><br />
<%= f.text_area :image_description %>
</div>
<div class="actions">
<%= f.submit %>
</div>
<% end %>
<强>控制器/ images_controller.rb 强>
class ImagesController < ApplicationController
# GET /images
# GET /images.json
def index
@images = Image.all
respond_to do |format|
format.html # index.html.erb
format.json { render json: @images }
end
end
# GET /images/1
# GET /images/1.json
def show
@image = Image.find(params[:id])
respond_to do |format|
format.html # show.html.erb
format.json { render json: @image }
end
end
# GET /images/new
# GET /images/new.json
def new
@image = Image.new
respond_to do |format|
format.html # new.html.erb
format.json { render json: @image }
end
end
# GET /images/1/edit
def edit
@image = Image.find(params[:id])
end
# POST /images
# POST /images.json
def create
@image = Image.new(params[:image])
respond_to do |format|
if @image.save
format.html { redirect_to @image, notice: 'Image was successfully created.' }
format.json { render json: @image, status: :created, location: @image }
else
format.html { render action: "new" }
format.json { render json: @image.errors, status: :unprocessable_entity }
end
end
end
# PUT /images/1
# PUT /images/1.json
def update
@image = Image.find(params[:id])
respond_to do |format|
if @image.update_attributes(params[:image])
format.html { redirect_to @image, notice: 'Image was successfully updated.' }
format.json { head :no_content }
else
format.html { render action: "edit" }
format.json { render json: @image.errors, status: :unprocessable_entity }
end
end
end
# DELETE /images/1
# DELETE /images/1.json
def destroy
@image = Image.find(params[:id])
@image.destroy
respond_to do |format|
format.html { redirect_to images_url }
format.json { head :no_content }
end
end
end
非常感谢你。我非常感谢你的帮助!!!