【问题标题】:How to show only articles written by users themselves through Devise in Rails如何在 Rails 中通过 Devise 仅显示用户自己撰写的文章
【发布时间】:2018-08-24 21:56:49
【问题描述】:

我正在使用 full_calendar 根据用户 ID 显示事件。

我有一个 home 索引,它呈现 _form.html.erb 的事件,并在此处创建事件。

当我使用日历移动到事件/索引时,我尝试仅显示基于 user_id 的事件。

但是,当前有用户 ID (1 ~ 3),但仅显示用户 ID (1) 的事件。其余用户 ID 创建的事件存储在数据库中,但在日历中不可见。

我想在日历中仅根据用户 ID 显示事件。

家庭控制器

def index
  @event = Event.new
  @events = Event.order("RANDOM()").first(1)
end

index.html.erb(家庭控制器)

<%= render partial: 'events/form', locals: { event: @event } %>

_form.html.erb(事件控制器)

<%= simple_form_for(@event) do |f| %>
  <%= f.error_notification %>
  <%= f.error_notification message: f.object.errors[:base].to_sentence if f.object.errors[:base].present? %>

  <div class="form-inputs">
    <%= f.input :title %>
    <%= f.input :description %>
    <%= f.input :color %>
    <%= f.input :start_time %>
    <%= f.input :end_time %>
    <%= f.hidden_field :user_id, :value => @event.user_id %>      
    <%= f.hidden_field :user_email, :value => @event.user_email %>      


  </div>
  <div class="form-actions">
    <%= f.button :submit %>
  </div>
<% end %>

index.html.erb(事件控制器)

<div class="row">
    <div class="col-lg-12">
        <section class="panel">
            <div class="panel-body">
                <div id="calendar"></div>
            </div>
        </section>
    </div>
</div>

<% @events.each do |x| %>
    <% if(x.user_id == current_user.id) %>
        <script type='text/javascript' src='jquery-1.8.1.min.js'></script>
        <script>
        $('#calendar').fullCalendar({
           header: {
                         left: 'prev,next today',
                         center: 'title',
                         right: 'month,agendaWeek,agendaDay'
                     },
                    events: '/events.json'
                });
        </script>
    <% else %>
        <script type='text/javascript' src='jquery-1.8.1.min.js'></script>
        <script>
        $('#calendar').fullCalendar({
           header: {
                         left: 'prev,next today',
                         center: 'title',
                         right: 'month,agendaWeek,agendaDay'
                     },
                });
        </script>
    <% end %>
<% end %>

【问题讨论】:

  • 我不明白 if / else 部分应该在 events.each 循环中做什么。你能详细说明一下吗?您还多次加载 jqeury 库,这不是一个好主意。

标签: ruby-on-rails


【解决方案1】:

您的事件模型中可能有以下行:

class Event < ApplicationRecord
  belongs_to :user

以及用户模型中的反射:

class User < ApplicationRecord
  has_many :events

利用这些关系,您可以在控制器中简单地执行以下操作:

@events = current_user.events

因为current_user 返回一个User 实例,并且当您在User 模型中定义has_many :events 时,Rails 在User 上创建了这个events 实例方法。

【讨论】:

  • 谢谢。这是最好的答案。
【解决方案2】:

我不完全理解您的问题,但如果您只想显示某个用户的帖子,最简单的方法是在模型中使用范围,并从控制器中调用它:

模型范围

  class Calendar
    scope :by_user, -> (user) { where(user:user) }
  end

并在您的控制器中使用它:

 def index
   @calendars = Calendar.by_user(current_user)
 end

这只会获取 user = current_user 的结果

【讨论】:

  • 对不起。我刚刚编辑了代码,因为它没有上传。你能再检查一下吗?
  • 这里使用范围不是最好的选择。一个常规的 Rails 关系就可以解决问题,它是框架的内置解决方案
  • 为什么范围不允许急切加载或连接?我认为语法比在每次调用时写where(user:user) 干净得多。
  • user.events 呢?
  • 是的,这确实是一个更好的选择,我同意。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-03
  • 2017-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-06
  • 1970-01-01
相关资源
最近更新 更多