我想使用基于Adam Shaw的jQuery FullCalendar插件的gem 'fullcalendar-rails'来组织我的应用程序的事件。
我阅读了费尔南多·佩拉莱斯(Fernando Perales(有用且写得很好的教程,该教程链接在 readme.md 文件中。 由于我想将fullcalendar-rails
用于我的Rails 5
应用程序,并且我是json
新手,因此我想问一些问题。
我的Event
模型有一个place
属性,即举行活动的地方。 我的目标是为不同的地方设置不同的日历,因为每个地方都有自己的活动。
我的想法是在事件索引页中插入以下形式:
<%= form_tag(events_path, method: :get, id: "search-event-place") do %>
<%= text_field_tag :search, params[:search], placeholder: "Search a place" %>
<%= submit_tag "Search", class: "btn btn-primary" %>
<% end %>
<% if @events.present? %>
<div id="calendar"></div>
<% end %>
通过这种方式,用户可以查找一个地点,并在该地点举行所有活动,并在完整日历中组织。因此,例如,如果用户在伦敦搜索活动,他将获得包含伦敦事件的日历......
事件控制器中的索引操作如下所示:
def index
if params[:search]
@events = Event.search(params[:search])
else
@events = nil
end
end
如果在Event
模型中定义search
方法后,我将index.json.builder
文件使用的实例变量@events
定义为@events = Event.search(params[:search])
,它会起作用吗?
搜索方法将在事件模型中定义如下:
def self.search(search)
where("place ILIKE ?", "#{search}")
end
RESTful 事件资源的索引页是否是定义@events
的正确位置? 如果我去:localhost:3000/events.json
或:localhost:3000/events
,我会看到什么事件?
我的主要关注点之一是:由于 RESTful Events 资源的show
操作对应于具有id=1
的事件的 url/events/1
,我想知道我是否会正确路由index.json.builder
文件中的每个事件生成 url 的 html 格式,例如/events/1.html
.事实上,作为公共轨道实践,我会在app/views/events/show.html.erb
中插入通用事件的部分
最后:我的用户使用 jQuery 日期选择器选择事件的日期,因此属性event_date
将保存为格式为"yy-mm-dd"
的字符串:如何设置 jsonstart
和end
?start
和end
属性是必需的,还是我只能选择活动的日期?
你好!
1. 查询
我认为这更适合作为scope
:
scope(:place, ->(search) { where('place LIKE ?', "%#{search}%") })
然后,您可以将其与其他查询等链接在一起。
更新:
此代码应添加到您的Event
模型中。 然后你可以调用Event.place('search-string').where(sun: true)
或者相反,它是可链接的。
2. 控制器
您可以使用index
操作,即
def index
respond_to do |format|
format.html
format.json do
@events = set_events
end
end
end
def set_events
if params[:place].present?
Event.place(params[:place])
else
Event.all
end
end
如果您有events#index
路由,则可以使用扩展.json
访问它,并从index.json.jbuilder
查看渲染的json。
例如,如果您访问/events
您将看到index.html.erb
,/events.json?place=place1
会将所有事件呈现为place1
json。
更新
该format.html
允许渲染html和json。
3. 查看
这需要一些决定:
- 您的地点是预定义的还是用户输入的?
- 用户如何搜索地点?
如果这些地方是预定义的(或可以访问的(,我会将日历呈现为:
<div class="fullcalendar" data-place="<%= 'place1' %>">
</div>
.JS:
const calendars = document.getElementsByClass('fullcalendar');
Array.from(calendars).forEach(function(calendar) {
const place = calendar.dataset.place;
calendar.fullCalendar({
eventSources: [{ url: '/events.json?place=' + place }],
other_options:...
});
});
4. 休息
我不明白您对show
的担忧或您对日期选择器的含义 - 请详细说明!
更新
这次我试图将所有内容放在一个 Gist 中。 https://gist.github.com/davidwessman/7597e3eea4e71238d7f71a74928e64bd 请检查是否有帮助!