Ruby on rails 在控制器中将局部变量用作参数

Ruby on rails 在控制器中将局部变量用作参数,ruby-on-rails,ruby-on-rails-5.2,Ruby On Rails,Ruby On Rails 5.2,我在这方面遇到了麻烦。我在这里连接了三个模型:用户、列表和笔名。从本质上说,用户可以上传书籍进行销售,但他们也可以创建假名,以防他们想以不同的名称列出一本书 这在列表显示页面上非常有效。我在控制器中使用这个 @pseudo = Pseudonym.find(@listing.pseudo_id) 然后在显示页面上,我只需使用来显示笔名 这是两个动作的控制器 def index @pseudo = Pseudonym.find_by(params[:pseudo_id]) @listin

我在这方面遇到了麻烦。我在这里连接了三个模型:用户、列表和笔名。从本质上说,用户可以上传书籍进行销售,但他们也可以创建假名,以防他们想以不同的名称列出一本书

这在列表显示页面上非常有效。我在控制器中使用这个

@pseudo = Pseudonym.find(@listing.pseudo_id)
然后在显示页面上,我只需使用
来显示笔名

这是两个动作的控制器

def index
  @pseudo = Pseudonym.find_by(params[:pseudo_id])
  @listings = Listing.all.order
end

def show
  @pseudo = Pseudonym.find(@listing.pseudo_id)
end 
对于上下文,我的笔名表只存储名称、id和创建它的用户id

  create_table "pseudonyms", force: :cascade do |t|
    t.string   "name"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.integer  "user_id"
    t.index ["user_id"], name: "index_pseudonyms_on_user_id"
  end
当用户创建一个新列表时,他们会从其所有笔名的下拉列表中选择笔名

新上市表格

<%= f.collection_select(:pseudo_id, current_user.pseudonyms, :id, :name, prompt: 'Select a pseudonym if you want to use one. Ignore this to use your real name.') %>
但是,在索引页上显示错误的笔名时,它会起作用。如果一个用户在数据库中只有一个笔名,就可以了。但是如果用户有多个,它将显示他们创建的第一个。它没有通过id查找假名,id必须来自
列表.pseudo\u id


我做错了什么

如果用户可以定义多个假名,请尝试检查列表是否有假名:

listing.pseudonyms.any?
如果是这样的话,迭代它们

listing.pseudonyms.each {|pseudonym| ... }

所以我设法让它起作用。我的问题是,我认为我可以像链接到路由一样执行控制器参数,这使它变得复杂。例如,可以使用

<%= link_to "Some Page", some_page_path(page.id) %>

我想我可以将局部变量从列表循环传递回控制器。最终,我只是让每个清单都有一个笔名

listing.rb

class Listing < ApplicationRecord
  belongs_to :user
  belongs_to :pseudonym, optional: true
类列表
笔名.rb

class Pseudonym < ApplicationRecord
 belongs_to :user
 has_many :listings
类假名
我从listings表中删除了pseudo_id列,并简单地添加了一个外键来引用pseudonyms表

class AddPseudonymsToListings < ActiveRecord::Migration[5.0]
  def change
    add_reference :listings, :pseudonym, index: true, foreign_key: true
  end
end
class AddPseudonymsToListings
现在,没有理由在控制器中显示任何内容。由于此列是可选的,因此有时此列可能为nil,因此在视图中,我指定仅在存在假名id时显示假名,否则显示用户名。我只是从这样的角度来称呼笔名:

<% if listing.pseudonym_id? %>
    <%= link_to listing.pseudonym.name, user_path(listing.user) %>
<% else %>
    <%= link_to listing.user.name, user_path(listing.user) %>
<% end %>


每个笔名都存储在“笔名”表中,因此在创建新列表时只能选择一个笔名。所以它存储在清单的pseudo_id列中。我认为这样链接它们会很简单。然后你想确保最近的一个被从数据库中取出,对吗?试试:
@listings=Listing.all.order('created_at DESC')
。我在这里看到的另一个问题是,您每次都会对所有列表进行排序,这可能会影响性能。在列表表单中,他们可以从所有可用假名的下拉列表中进行选择,以填充伪id。我将更新问题以显示这一点。您是否可以更改
@pseudo=pseudo.find_by(params[:pseudo_id])
@pseudo=pseudo.find(params[:pseudo_id])
在您的
索引操作中?是的,现在我刚刚得到一个错误<代码>找不到“id”=
的笔名。笔名也可以很好地保存到listings表中,因为它们会显示在show页面上。就在索引页上,它们都显示为该用户最早创建的。我假设您正在请求参数
params[:pseudo_id]
中发送假名?如果请求中没有化名,您需要有一名保安,以防用户ir没有使用化名。我不知道我在发送什么,也不知道我在为此做什么。:)至于第二部分,我想问一下是否有,如果没有,它会显示用户的真实姓名。你能加上这一行:
put“===pseudo-name-ID requested=[{params[:pseudo-ID]}]”
就在这之前:
@pseudo=pseudo-name.find-by(params[:pseudo-ID])
在控制器中查看是否向控制器发送假名,请求应用程序中的索引页并检查日志?
<% if listing.pseudonym_id? %>
    <%= link_to listing.pseudonym.name, user_path(listing.user) %>
<% else %>
    <%= link_to listing.user.name, user_path(listing.user) %>
<% end %>