首页 > 解决方案 > 在控制器中使用局部变量作为参数

问题描述

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

这在列表显示页面上效果很好。我在控制器中使用它。

@pseudo = Pseudonym.find(@listing.pseudo_id)

然后在显示页面上我只是<%= @pseudo.name %>用来显示假名。

这是两个动作的控制器。

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.') %>

我的问题是当我需要在任何索引页面上显示假名时。当我遍历所有列表时,我不再可以访问@listing.pseudo_id.

<% @listings.each do |listing| %>
    <li>
        <%= link_to listing do %>
            <%= image_tag listing.image.url(:thumb), title: listing.title %>
        <% end %>

        <div class="listing_overview">          
            <h2><%= link_to truncate(listing.title, length: 24, separator: ' '), listing_path(listing) %></h2>

            <div id="stars">
                <div class="star-rating" data-score=<%= listing.avg_rating %> style="max-width: 10%; margin-0;"></div>
            </div>

            <%= image_tag(listing.user.image.url, title: listing.user.username) %>

            <% if listing.pseudo_id? %>
                <%= link_to @pseudo.name, user_path(listing.user) %></p>
            <% else %>
                <%= link_to listing.user.name, user_path(listing.user) %></p>
            <% end %>
            <b><%= number_to_currency(listing.price) %></b>
        </div>
    </li>
<% end %>

但是,它可以在索引页面上显示错误的假名。如果一个用户在数据库中只有一个化名,那很好。但是任何拥有多个用户的用户,都会显示他们创建的第一个用户。它不是通过 id 找到假名,它需要来自listing.pseudo_id.

我究竟做错了什么?

标签: ruby-on-railsruby-on-rails-5.2

解决方案


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

listing.pseudonyms.any?

如果是这样,遍历它们

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

推荐阅读