如何仅在 rails 中使用用户特定对象?

How do I only use user specific objects in rails?

我有 2 个模型,一个用于 Users,另一个用于 Medications。每个用户可以有很多药物。该用户可以创建药物,但看不到其他用户制作的药物。

<% @medications.each do |medication| %>
      <tr>
        <td><%= medication.name %></td>
        <td><%= medication.user_id %> </td>  

显然这段代码没有达到我想要的效果,但我如何才能将第一部分修改为仅在 current_user.id == medication.user_id 时才有效的条件?

选项 1:在您的控制器中,仅获取当前用户的药物。

# user model
class User < ActiveRecord::Base
  has_many :medications # this needs to be in place
end

# in controller action that is rendering your view
@medications = current_user.medications

选项 2:在您看来,跳过 user_id 列中没有当前用户 ID 的药物:

# view
<% @medications.each do |med| %>
  <% next if (med.user_id != current_user.id) %>
  <% # more code %>
<% end %>

如果您根据当前用户显示部分药物,那么显然:

# view
<% @medications.each do |med| %>
  <%= medication.name # example %>
  <% next if (med.user_id != current_user.id) %>
  <%= medication.reason # example %>
<% end %>

除非您还需要显示其他药物/其他信息,否则我会选择选项 1。

在您的药物模型中使用 scope 以便您可以找到当前用户的药物并在其他地方使用它:

   scope :users_medication, ->(current_user) { where user_id: current_user.id}

然后在您的视图中调用您刚刚在 Medication class 上定义的 class 方法并将其传递给当前用户:

<% Medication.users_medication(current_user).each do |medication| %>
      <tr>
        <td><%= medication.name %></td>
        <td><%= medication.user_id %> </td>

在你的控制器中

def show
   @user = User.find(params[:id])
   @medications = @user.medications
end

这将仅显示该特定用户的药物