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

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

ただいまの
回答率

90.77%

  • Ruby

    7060questions

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

データの編集。edit.updateアクション

解決済

回答 1

投稿

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

takeke

score 14

ecサイト作ってるのですが、商品の編集ができなくて困っています。

scaffoldは使っていないのですが、編集をするとエラーは吐き出されないのですが前の状態のまま表示され、結局編集していないことになってしまします。

class ProductsController < ApplicationController

  def index
      @products = Product.all

      if params[:title].present?
      @products = @products.get_by_name params[:title]
    end
  end
  def new
      @product = Product.new    
  end
  def create
      @product = Product.new(product_params)

      respond_to do |format|
      if @product.save
        format.html { redirect_to @product, notice: 'Product was successfully created.' }
        format.json { render :show, status: :created, location: @product }
      else
        format.html { render :new }
        format.json { render json: @product.errors, status: :unprocessable_entity }
      end
    end
  end
  def show
      @product = Product.find_by(id: params[:id])
  end
  def edit
      @product = Product.find_by(id: params[:id])
  end
  def update

    @product = Product.find_by(id: params[:id])

    respond_to do |format|
      if @product.update(product_params)
        format.html { redirect_to @product, notice: 'Product was successfully updated.' }
        format.json { render :show, status: :ok, location: @product }
      else
        format.html { render :edit }
        format.json { render json: @product.errors, status: :unprocessable_entity }
      end
    end
  end
  def destroy

      @product = Product.find_by(id: params[:id])

    @product.destroy
    respond_to do |format|
      format.html { redirect_to products_url, notice: 'Product was successfully destroyed.' }
      format.json { head :no_content }
    end
  end
  def who_bought
      @product = Product.find(params[:id])
      respond_to do |format|
          format.atom
      end
  end

  private
    def set_product
      @product = Product.find(params[:id])
    end

    def product_params
      params.require(:product).permit(:title, :description, :image_url, :price, :category_id)
    end
end
class Product < ApplicationRecord

    has_many :line_items
    has_many :orders, through: :line_items
    has_many :favorites, dependent: :destroy

    belongs_to :category

    before_destroy :ensure_not_referenced_by_any_line_item

    validates :title, :description, presence: true
    validates :price, numericality: {greater_than_or_equal_to: 0.01}
    validates :title, uniqueness: true
    validates :image_url, allow_blank: true, format: {
        with:  %r{\.(gif|jpg|png)\z}i,
        message: 'はgif,jpg,png画像のURLでなければなりません' 
    } 

    scope :get_by_name, ->(title){
        where('title like ?',"%#{title}%")
    }

    def favorited_by? user
        favorites.where(user_id: user.id).exists?

    end

    private

      def ensure_not_referenced_by_any_line_item
          if line_items.empty?
              return true
          else
              errors.add(:base, '品目が存在します')
              return false
          end
      end
end


products/edit.html.erb

<%= form_with(model: product, path: products_path, method: :post, local: true) do |form| %>
  <% if product.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(product.errors.count, "error") %> prohibited this product from being saved:</h2>

      <ul>
      <% product.errors.full_messages.each do |message| %>
        <li><%= message %></li>
      <% end %>
      </ul>
    </div>
  <% end %>

  <div>
    <%= form.label :title %>
    <%= form.text_field :title %>
  </div>

  <div>
    <%= form.label :description %>
    <%= form.text_area :description, rows: 6 %>
  </div>

  <div>
    <%= form.label :image_url %>
    <%= form.text_field :image_url %>
  </div>

  <div>
    <%= form.label :price %>
    <%= form.text_field :price %>
  </div>

  <div>
    <%= form.label :category %>
    <%= form.collection_select :category_id, Category.all, :id, :c_name %>
  </div>


  <div>
    <%= form.submit %>
  </div>
</div>
<% end %>

参考書見ながらここら辺は書いたつもりです
商品のコントローラー自体は結構前に作って、最近はカテゴリーを追加したのですがそこで編集がうまくできないことに気づきました。カテゴリー追加前までは普通にできていたような気もするんですが記憶が曖昧です。
ちなみにカテゴリー機能の方の編集も同じように編集できないでいます。コントローラーもうまくいかなかったので商品のコントローラーの主要な部分をそのまま名前変えて使っています。

以上なんですが、どこか編集できない原因などお気づきになられた方いましたらご教授いただけましたら幸いです。宜しくお願いします。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

check解決した方法

0

フォームの書方を変えただけで解決できました。
<%= form_with(model: product, path: products_path, method: :post, local: true) do |form| %>   

↓これに変更

<%= form_for @product do |form| %>

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

  • ただいまの回答率 90.77%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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

  • Ruby

    7060questions

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