Rails和SQLITE:未显示图像

时间:2013-03-22 02:06:00

标签: ruby-on-rails ruby sqlite associations linkage

我是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同步。 你知道我做错了什么以及如何解决它?

谢谢。

4 个答案:

答案 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

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