質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.53%

  • Ruby

    9214questions

    Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

  • Ruby on Rails

    8638questions

    Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

  • ループ

    63questions

    ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

【Railsのループ処理】情報を追加する際、2つ目を登録すると1つ目の内容に上書きされないようにするためには?

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 60

kazuki0714

score 1

アパレル向けのRPAを開発しています。

1ユーザーに付き、複数の生地見本を登録する機能を作りたいのですが
2つめの見本を登録すると上書きされて1つしか表示されません。

この場合、2つとも表示されるようにするにはどうすればよろしいでしょうか?
(HTMLやらCSSの汚さは一旦無視していただければ幸いです。まだ初心者レベルを脱していません。。。)

【ここで壁にぶつかってます】
顧客詳細ページの「スワッチを追加」からスワッチページに飛んで登録するとこのページになります。
1つしか登録していないのに同じ内容が4つ表示されています。「スワッチを追加」の下の4つの表です。

また2つめを登録すると1つめが上書きされて、2つめの情報が4つ表示されます。
顧客一覧で4人登録されているので、そうなっているのだと思いますが解決方法が分からず。。。

「スワッチを追加」の下のループ処理 (@posts.each do |post|)がそもそも間違っているのでしょうか?

イメージ説明

# app/views/posts/show.html.erb

<h1> 顧客詳細</h1>

<div class="main posts-show">
  <div class="container"> # 顧客情報を登録したら表示される
    <div class="posts-show-item">

    <p>会社名:<%= @post.company %></p><br>
    <p>業態:<%= @post.category %></p><br>
    <p>お客様名:<%= @post.name %></p><br>
    <p>担当者:<%= @post.chargeName %></p><br>
    <p>備考:<%= @post.other %></p><br>
    <p>名刺:<%= @post.image_name %></p><br>
    <%= image_tag "/images/#{@post.id}.jpg", :size =>'320x240'%>

    </div>

    <div class="post-menus"> 
        <%= link_to("編集", "/customers/#{@post.id}/edit") %>
        <%= link_to("削除", "/customers/#{@post.id}/destroy",{method:"post"}) %>

    </div>

    <%= link_to("スワッチを追加", "/customers/#{@post.id}/orders/new") %>

    <div class="container"> #スワッチを登録したら表示される 
    <% @posts.each do |post| %>

    <div class="posts-swatch-item">
      <table border="1">
        <tr>
          <th>No</th>
          <th>Vol</th>
          <th>品番</th>
          <th></th>
        </tr>

        <tr>
          <td>row-counter</td>
          <td><%= @post.collection %></td>
          <td><%= @post.number %></td>
          <td><%= link_to("詳細", "/customers/#{@post.id}") %></td>
        </tr>
      </table>
    </div>
    <% end %>

    </div>


  </div>
</div>

上記の画面から「スワッチを追加」を押すと以下の画像ページに飛びます。
このページの登録ボタンを押すと再び詳細ページ(/customers/:id)に戻ります。

イメージ説明

# views/posts/swatch.html.erb
<%= form_tag("/customers/#{@post.id}/swatch_create",{multipart: true}) do %>

<h1>スワッチ登録</h1>
<p>以下の顧客のPICKUPスワッチを登録します。</p>

<p>会社名:<%= @post.company %></p><br>
<p>お客様名:<%= @post.name %></p><br>
<p>担当者:<%= @post.chargeName %></p><br>

<p>
  <select name="collection" required>
    <option value="vol.1">vol.1</option>
    <option value="vol.2">vol.2</option>
    <option value="vol.3">vol.3</option>
  </select>
</p>


<p>登録するコレクションを選んでください</p>

<p>スワッチ1</p>

<input name="number" placeholder="品番を入力してください"><br>

<input name="swatch_note" placeholder="備考"><br>


<p><input type="submit" value="登録"></p>

<% end %>


routes.rbとposts_controller は以下になります。

#routes.rb
Rails.application.routes.draw do
  get '/' => "home#top"
  get '/customers' => "posts#index" #顧客一覧
  get '/customers/new' => "posts#new" #顧客登録
  post '/customers/create' => "posts#create" #登録ボタン押したときのアクション
  get '/customers/:id/edit' => "posts#edit" #顧客情報編集
  post '/customers/:id/update' => "posts#update" #更新
  post "/customers/:id/destroy" => "posts#destroy" #削除

  get '/customers/:id' => "posts#show" #顧客詳細画面
  get '/customers/:id/orders/new' => "posts#swatch" #スワッチ登録画面
  post '/customers/:id/swatch_create' => "posts#swatch_create" #登録ボタン押したときのアクション
class PostsController < ApplicationController
  def index
    @posts = Post.all
  end

  def new
  end

  def create
    @post = Post.new(company: params[:company], category: params[:category], department: params[:department], 
            name: params[:name], chargeName: params[:chargeName], other: params[:other], )

    @post.save
    redirect_to("/customers/#{@post.id}")
  end

  def show
    @posts = Post.all
    @post =Post.find_by(id:params[:id])

  end

  def edit
    @post = Post.find_by(id:params[:id])
  end

  def update
    @post = Post.find_by(id: params[:id])
    @post.company = params[:company]
    @post.category = params[:category]
    @post.department = params[:department]
    @post.name = params[:name]
    @post.chargeName = params[:chargeName]
    @post.other = params[:other]

    if params[:image]
      @post.image_name ="#{@post.id}.jpg"
    image = params[:image]
    File.binwrite("public/images/#{@post.id}.jpg", image.read)
    end

    @post.save
    redirect_to("/customers")
  end

  def destroy
    @post = Post.find_by(id: params[:id])
    @post.destroy
    redirect_to("/customers")
  end

  def swatch
    @post = Post.find_by(id:params[:id])
  end

  def swatch_create
    @post = Post.find_by(id: params[:id])

    @post.collection = params[:collection]
    @post.swatch_note = params[:swatch_note]
    @post.number = params[:number]

    @post.save
    redirect_to("/customers/#{@post.id}")
  end


end

アドバイスいただければ幸いです。
よろしくお願いいたします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

0

同じ内容が表示されてしまうという部分については @posts.each do |post| のブロックで post を参照していないからのように見えます。@post ではなく post を使うようにしてみてください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

同じタグがついた質問を見る

  • Ruby

    9214questions

    Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

  • Ruby on Rails

    8638questions

    Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

  • ループ

    63questions

    ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

  • トップ
  • Rubyに関する質問
  • 【Railsのループ処理】情報を追加する際、2つ目を登録すると1つ目の内容に上書きされないようにするためには?