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 %>