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

时间:2015-02-19 21:32:18

标签: ruby-on-rails ruby model

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

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

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

3 个答案:

答案 0 :(得分:1)

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

除非您需要显示其他药物/其他信息,否则我会使用Option1。

答案 1 :(得分:1)

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

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

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

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

答案 2 :(得分:0)

在您的控制器中

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

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