0

我对 Rails 和 Web 编程非常陌生,希望您能帮助我完成我的第一个项目。我正在为房地产中介开发一个网站。

我的数据库中有 3 个表(家庭:Home_ID、Home_Name、Admin_ID;管理员:Admin_ID、Admin_Name、Admin_Email;图像:Image_ID、Image_Path、Image_Name、Home_ID、Admin_ID)。

所有 3 个表都是使用脚手架创建的。图像信息(名称、路径、image_id、home_id 等)已在 SQLite 中输入。除了图片,我得到了网站上正确显示的不同房屋的所有文本信息。

我尝试在 view/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 同步。您知道我做错了什么以及如何解决吗?

谢谢你。

4

4 回答 4

0

发生的情况是您正在循环从 Home 表中选择的记录。正因为如此,当你打电话

<td><%= home.image_path %></td>

它无法识别该属性image_path,因为您没有image_pathHome 表的列。您的列只有 Home_ID、Home_Name、Admin_ID。您将不得不研究模型之间的关联,以便弄清楚如何获取image_path每个家庭记录。你可以从这里开始。

如果您稍后更新代码,我将很高兴对此发表评论。

于 2013-03-22T02:11:08.980 回答
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

然后运行:

耙分贝:迁移

此时,您只需要更新您的控制器和视图以显示此关联。让我知道这是否有帮助,如果有帮助,我会帮助您处理控制器和视图。

于 2013-03-22T02:49:40.647 回答
0

我认为这里最好的解决方案是使用回形针宝石。你可以看看这个非常古老的 railscast eoisode 来了解它是如何工作的:

http://railscasts.com/episodes/134-paperclip

这是github存储库:

https://github.com/thoughtbot/paperclip

Paperclip 将帮助您处理图像的路径、样式和预览。

于 2013-03-22T11:33:05.703 回答
0

谢谢杰森,

我同意这对新手来说有点大,但要求是我们做一个需要从/向数据库读取和写入的网站。我们通过合作伙伴对 Rails 进行了快速介绍,现在我们独自一人,“有点”迷路了,时间不多了。

这是我收到的错误消息:

房屋中的名称错误#index

未定义的局部变量或方法“图像”

<#:0xb62f7aa4>

提取的源代码(大约第 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>

当我创建数据库表时,我在 home 表中有一个 Image_ID,但我被告知我不需要它,并且在 images 表中只有 Home_ID 就足够了。

我了解该错误是由于 image.home_id 引起的。你有什么意见?我应该将 Image_ID 添加回 home 表以显示相应 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

非常感谢。我真的很感谢你的帮助!!!

于 2013-03-24T11:58:15.290 回答