0

私は Rails と Web プログラミングに非常に慣れていないので、最初のプロジェクトで私を助けてくれることを願っています. 私は不動産会社のウェブサイトを開発しています。

データベースに 3 つのテーブルがあります ( Homes : Home_ID, Home_Name, Admin_ID; Admins : Admin_ID, Admin_Name, Admin_Email; Images : 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

私はあなたの画像と家のモデルとの関係がどうなるかについては肯定的ではありませんが、私が間違っていれば私は正しいでしょうが、家にはたくさんの画像があると思います。各画像は1つの家に属します。これは正しいです?もしそうなら、あなたはそのようにあなたのモデルでそれを宣言する必要があるでしょう:

models / home.rb

has_many :images

models / 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

この時点で、この関連付けを表示するには、コントローラーとビューを更新するだけで済みます。これが役立つかどうか教えてください。役立つ場合は、コントローラーとビューのサポートを行います。

于 2013-03-22T02:49:40.647 に答える
0

ジェイソン、ありがとう

初心者には少し大きいことに同意しますが、要件は、データベースを読み書きする必要がある Web サイトを作成することでした。私たちはパートナーワークで Rails を簡単に紹介しましたが、今は独りで「少し」迷い、時間がなくなっています。

これが私が得ているエラーメッセージです:

NameError in Homes#index

未定義のローカル変数またはメソッド「image」

<#: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>

データベース テーブルを作成したとき、homes テーブルに Image_ID がありましたが、これは必要ないので、images テーブルに Home_ID だけあれば十分だと言われました。

image.home_id が原因でエラーが発生していることは理解しています。あなたの意見は何ですか?それぞれの home_id のすべての画像を表示するには、Image_ID を homes テーブルに戻す必要がありますか、それとも別の方法がありますか? どの画像をメインの画像として表示し、どの画像を小さい画像として表示するかを決定できるようにしたいと考えています。

私が使用するコードは次のとおりです。

models/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 に答える
0

何が起こっているかというと、Home テーブルから選択したレコードをループしています。このため、電話をかけると

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

ホームテーブルの列としてimage_path持っていないため、属性を認識していません。image_path列には Home_ID、Home_Name、Admin_ID しかありません。image_path各ホーム レコードを取得する方法を理解するには、モデル間の関連付けを調べる必要があります。ここから開始できます。

後でコードを更新する場合は、喜んでコメントします。

于 2013-03-22T02:11:08.980 に答える
0

ここでの最善の解決策は、paperclip gem を使用することだと思います。この非常に古い Railscast eoisode を見て、それがどのように機能するかを理解することができます:

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

そして、ここにgithubリポジトリがあります:

https://github.com/thoughtbot/paperclip

Paperclip は、画像のパス、スタイル、およびプレビューに役立ちます。

于 2013-03-22T11:33:05.703 に答える