使用Rails将params [:id]带入.json文件

时间:2015-01-27 10:07:56

标签: ruby-on-rails ruby json

我目前正在使用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'

1 个答案:

答案 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"},

]