我目前正在使用Rails的Full Calendar gem,而且一切都很完美。但是,我想通过Ruby on Rails中的路由,根据地址栏中的:id动态显示日历事件。
这是我的index.json.jbuilder文件
json.array!(@appointments.all.where(:user_id => params[:id])) do |appointment|
json.extract! appointment, :id, :user_id, :business_title, :address
json.user appointment.user_id
json.title appointment.business_title
json.start appointment.starts_at
json.className 'boobs'
json.end appointment.starts_at + 30.minutes
json.url appointment_url(appointment, format: :html)
end
当params [:id]替换为我的数据库中的现有用户ID时,这种方法有效。生成它的url是localhost:3000 / c / 2,所以这应该显示已创建/或属于ID为2的用户的所有事件。这是我的路线:
get 'calendar/:id' => 'users#calendar'
答案 0 :(得分:2)
在日历操作中,写下:
@id = params[:id]
然后在你的jbuilder文件中写下:
json.array!(@appointments.all.where(:user_id => @id)) do |appointment|
我想这意味着,您在日历操作中有这个:
@appointments = Appointment
...这让我很奇怪:你为什么不在日历行动中做以下事情:
@appointments = Appointment.all.where(:user_id => params[:id])
...然后在你的jbuilder文件中:
json.array! @appointments do |appointment|
...
...
end
对评论的回应:
假设您按照以下方式设置控制器:
class UsersController < ApplicationController
def calendar
@user_id = params[:user_id] #route: get 'users/calendar/:user_id', to: 'users#calendar'
#By default, render()'s calendar.html.erb
end
def feed
@appointments = Appointment.all.where(user_id: @user_id)
#For the request: http://localhost:3000/users/feed.json, by
#default render()'s /app/views/users/feed.json.jbuilder
end
end
..然后你请求你的calendar()动作:
http://localhost:3000/users/calendar/2
问题是:一旦你的rails应用程序响应了一个请求,一个动作中的所有变量都被销毁,所以@user_id
被分配了params[:user_id]
的值,即2,将被摧毁。因此,当您的日历在此处向Feed()操作发送请求时:
<script>
$(document).ready(function() {
// page is now ready, initialize the calendar...
$('#calendar').fullCalendar({
events: '/users/feed.json' //****HERE****
})
});
</script>
...您将无法在feed()操作中访问@user_id。
并且,由于日历从未获得user_id,因此当日历向/users/feed.json
发送请求时,日历无法将其包含在网址中。
Web的无状态性质长期以来一直是开发人员的荆棘,所以他们发明了使用隐藏表单字段,cookie,会话,在请求之间保持数据的方法,本地存储,数据库等
Rail提供了一个非常简单的会话机制,您可以这样使用:
#route: get 'users/calendar/:user_id', to: 'users#calendar'
def calendar
session[:user_id] = params[:user_id] #Store the value in the session hash.
end
def feed
@appointments = Appointment.all.where(user_id: session[:user_id]) #Retrieve the value from the session hash.
end
但是,您应该在使用会话时阅读potential problems。
最后,据我所知,你的jbuilder页面会响应大量不相关的数据。根据{{3}},活动只需要:title
和开始时间:starts_at
。但是,您的jbuilder文件提供了事件甚至不使用的其他数据:
:id
:user_id
:address
并且,您实际上提供了两次:user_id数据,一次是:
json.extract! appointment, :id, :user_id, :business_title, :address
并且第二次使用其他名称user
别名:
json.user appointment.user_id
在我看来,以下就是您所需要的:
json.array! @appointments do |appointment|
json.title appointment.business_title
json.start appointment.starts_at
json.className 'boobs'
json.end appointment.starts_at + 30.minutes
json.url appointment_url(appointment, format: :html)
end
......像这样产生json;
[
{"title":"XYZ",
"start":"2014-12-25T12:30:00.000Z",
"className":"boobs",
"end":"2014-12-25T13:00:00.000Z",
"url":"http://localhost:3000/appointments/1.html"},
{"title":"ABC",
"start":"2015-01-25T09:30:00.000Z",
"className":"boobs",
"end":"2015-01-25T10:00:00.000Z",
"url":"http://localhost:3000/appointments/2.html"},
{"title":"TTT",
"start":"2015-01-03T14:30:00.000Z",
"className":"boobs",
"end":"2015-01-03T15:00:00.000Z",
"url":"http://localhost:3000/appointments/3.html"},
]