【问题标题】:rails giving activerecord instead of idrails 给出 activerecord 而不是 id
【发布时间】:2021-08-11 12:06:25
【问题描述】:

我想点击链接以显示产品页面中的内容

当 id do /products/1 显示我的产品时 products/%23<Product::ActiveRecord_Relation:0x00007f11426994c0> 这对于我点击的每个链接都是不同的。现在的问题是当我点击链接时它显示Couldn't find Product with 'id'=#&lt;Product::ActiveRecord_Relation:0x00007f11426994c0&gt; 它应该不做id 而不是ActiveRecord ???

这是我的产品控制器

class ProductsController < ApplicationController
  include ProductsHelper

  # before_action :logged_in?, only: [:index, :show, :edit]
  before_action :admin_only, only: %i[destroy reset_votes]

  def index
    @products = Product.all
  end
  
  def edit
    @product = Product.find(params[:id])
  end 

  def create
    @product_params = params.require(:product).permit(%i[name size image])
  end

  def destroy
  end

  def add_to_cart
    id = params[:id].to_i

    if session[:cart].include?(id)
      session[:cart].delete(id)

    else
      session[:cart] << id
    end

    redirect_back(fallback_location: root_path)
  end

  def show
    @products = Product.find(params[:id])
  end

  def update
    @product = Product.find(params[:id])
    product_params = params.require(%i[name size image])
    @product.update_attributes(product_params)
  end
  

  private

  def product_params
    params.require(:category).permit(%i[name size image])
  end
end

这是我的产品索引,如图一所示

<table>
  <tr>
    <th>Name</th>
    <th>Size</th>
    <th>Price</th>
    <th>Category</th>
    <th>Image</th>
  </tr>
  <% Product.all.each do |f| %>
  <tr>
    <td><%= link_to f.name, product_path(@products) %></td>
    <td><%= f.size %></td>
    <td><%= f.price %></td>
    <td><%= image_tag(f.image, :width => "60%") %></td>
    <% end %>
  </tr>
  </tr>
</table>

我遇到的另一个问题是当我访问products/1/edit 时 并填写表格,它给出了另一个问题,说No route matches [PUT] "/products/1/edit"在我的路线中我已经将它作为resources :products

这是 products/edit.html.erb

<% provide(:title, "Edit Product - ") %>
<h1>Edit Product <%= @products %></h1>
<p class="lead">Fill out the following fields</p>
<%= render 'products/form', products: @products, url: products_path(@products), method: :put %>

这是products/_form.html.erb

<div class="form">
  <%= form_for :products, method: method do |f| %>
    <%= render 'shared/flash_messages' %>

    <div class="form-group">
      <%= f.label :name %>
      <%= f.text_field :name, class: 'form-control', placeholder: 'Product Name' %>
    </div>
    <div class="form-group">
      <%= f.label :size %>
      <%= f.text_field :size, class: 'form-control', placeholder: 'Product Size' %>
    </div>
    <div class="form-group">
      <%= f.label :price %>
      <%= f.text_field :price, class: 'form-control', placeholder: 'Product Size' %>
    </div>
    
    <div class="form-group">
      <%= f.label :image %>
      <%= f.file_field :image, hidden: true %>
      </div>
    </div>
    <%= f.submit class: 'btn btn-primary btn-primary--wide', value: 'Update Product' %>
  <% end %>
</div>

谢谢你!

【问题讨论】:

    标签: html ruby-on-rails ruby


    【解决方案1】:

    您好像混淆了singularplural 形式的变量!

    在您的 product > index 文件中,更改以下行:

    &lt;td&gt;&lt;%= link_to f.name, product_path(@products) %&gt;&lt;/td&gt;

    收件人:

    &lt;td&gt;&lt;%= link_to f.name, product_path(f) %&gt;&lt;/td&gt;

    为什么会有这种变化?您正在使用@products 运行一个循环,并且您在product_path 内部发送这个@products 变量,这是一个AR 记录列表!您应该只发送一个产品对象,即您在循环中定义的f。 [这是一个非常糟糕的变量命名]

    另一件事:

    update 表单中的相同问题:

    &lt;%= render 'products/form', products: @products, url: products_path(@products), method: :put %&gt;

    在这里你应该通过@product,而不是@products! 您更新的是单个记录,而不是产品列表,对吧?

    【讨论】:

    • 这很有意义!但现在的问题是,当我点击更新产品时,它显示No route matches [PUT] "/products/1/edit"
    • 在您的products/_form 文件中使用:&lt;%= form_for @product do |f| %&gt; 行。并删除 &lt;%= form_for :products, method: method do |f| %&gt; 这一行。那就看看魔法吧! @AndrewTran
    【解决方案2】:

    当您在 Products 数组和使用 f 的局部变量上循环时,您必须使用 f 而不是 @products。喜欢,&lt;td&gt;&lt;%= link_to f.name, product_path(f) %&gt;&lt;/td&gt;。 另外,对于编辑模板,我认为您可以使用以下更改。

    <% provide(:title, "Edit Product - ") %>
    <h1>Edit Product <%= @product %></h1>
    <p class="lead">Fill out the following fields</p>
    <%= render 'products/form', products: @product, url: products_path(@product), method: :put %>
    

    您可以尝试另一件事 rails scaffold 命令,它会为您生成所有代码,您可以从中获得一些想法。

    【讨论】:

      猜你喜欢
      • 2011-06-25
      • 1970-01-01
      • 2013-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-05
      • 1970-01-01
      相关资源
      最近更新 更多