Ruby on Rails:如何在 _form.html.erb 中编写'form.select'以仅显示用户创建的类别



我有一个市场应用程序,用户可以在其中创建产品和类别

在产品_form.html.erb中,用户可以创建一个产品并为其分配一个类别。问题是类别"form.select"显示所有用户创建的所有类别。

如何重写

<div>
<%= form.select :category_id, Category.all.map {|c| [c.category, c.id]} %>
</div>

是否只显示当前用户创建的类别?

--

<%= form_with(model: product, 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 class="field">
<%= form.label :title %>
<%= form.text_field :title %>
</div>
<div class="field">
<%= form.label :description %>
<%= form.text_area :description %>
</div>
<div class="field">
<%= form.label :price %>
<%= form.text_field :price %>
</div>
<div>
<%= form.select :category_id, Category.all.map {|c| [c.category, c.id]} %>
</div>
<div class="actions">
<%= form.submit %>
</div>
<% end %>

但它列出了数据库中的所有类别。如何编写此代码,以便表单仅列出用户生成的类别。

数据库

create_table "categories", force: :cascade do |t|
t.string "category"
t.bigint "user_id", null: false
t.datetime "created_at", precision: 6, null: false
t.datetime "updated_at", precision: 6, null: false
t.index ["user_id"], name: "index_categories_on_user_id"   end
create_table "products", force: :cascade do |t|
t.string "title"
t.text "description"
t.decimal "price", precision: 8, scale: 2
t.bigint "user_id", null: false
t.datetime "created_at", precision: 6, null: false
t.datetime "updated_at", precision: 6, null: false
t.integer "category_id"
t.index ["user_id"], name: "index_products_on_user_id"   end
create_table "users", force: :cascade do |t|
t.string "email", default: "", null: false
t.string "encrypted_password", default: "", null: false
t.string "reset_password_token"
t.datetime "reset_password_sent_at"
t.datetime "remember_created_at"
t.integer "sign_in_count", default: 0, null: false
t.datetime "current_sign_in_at"
t.datetime "last_sign_in_at"
t.string "current_sign_in_ip"
t.string "last_sign_in_ip"
t.string "username"
t.string "name"
t.boolean "admin", default: false
t.datetime "created_at", precision: 6, null: false
t.datetime "updated_at", precision: 6, null: false
t.string "uid"
t.string "provider"
t.string "access_code"
t.string "publishable_key"
t.string "stripe_id"
t.boolean "subscribed"
t.string "card_last4"
t.string "card_exp_month"
t.string "card_exp_year"
t.string "card_type"
t.text "perk_subscriptions", default: [], array: true
t.string "s_name"
t.index ["email"], name: "index_users_on_email", unique: true
t.index ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true   end

您应该做的第一件事是确保您的关联是正确的。你应该有:

类别.rb

belongs_to :user

user.rb

has_many :categories

完成此操作后,您应该能够使用<%= form.select :category_id, current_user.categories.all.map {|c| [c.category, c.id]} %>,假设您有权访问current_user

相关内容

  • 没有找到相关文章

最新更新