2017-04-22 27 views
0

我对遥控器感到困惑:在Rails窗体中是这样的,我认为需要一些JavaScript来使其成为异步的,但这似乎只是打破了我的页面。Rails和AJAX remote:true还需要什么?

这是一个非常简单的index.html.haml包括部分显示所有的约会:

%h1 Calander 

%h2 AppointmentsController 
%h3 Make a new appointment 

= form_for @appointment, remote: true do |f| 
    = f.text_field :title 
    = f.text_field :appt_time 
    = f.submit 'Make appointment' 

#appointments 
    =render 'appointments' 

这就是前面提到的部分:

[email protected] do |a| 
    %h3= a.title 
    %p= a.appt_time 

索引和创建控制器方法:

def index 
    @appointments = Appointment.order('appt_time ASC') 
    @appointment = Appointment.new 
    end 

    def create 
    @appointmet = Appointment.create(appointment_params) 
    redirect_to :root 
    end 

现在,这工作正常。我可以添加一个新的约会,点击提交,新的约会显示,而不刷新页面,我想因为我已经包括remote: true。那么我需要添加其他什么来处理请求?我是否违反了最佳做法,不包括处理此请求的内容并完全依赖于远程:是真的?

回答

1

没有更多的要求,除非你想要一些回调AJAX调用。你没有违反任何约定。你可以阅读这个document,以避免混淆。

1

让我们退后一步。

Web应用程序可以响应不同的请求格式。 Rails有内置的格式处理。

所以一个请求可能会通过HTML请求index,这个响应是一个HTML文件。它也可能通过JSON,XML,PDF甚至JavaScript请求index

每当您添加remote: true时,您都会告诉您的表单通过JS代替HTML来发出POST请求。

在你的观点你会有一堆HTML.ERB文件。这些视图是请求响应。

因此,要处理JS索引索引,您将需要一个app/views/appointements/index.js文件。

这将作为对请求的响应发送,浏览器将知道如何处理JS响应。

index.js中,您可以编写在接收到响应后执行的JS。

您也可以将部分加载到页面中。

例如:

# app/views/appointements/index.js 
$('#appointements').html('<%= j render "appointements" %>') 

这会使部分内容作为JavaScript字符串响应。

http://guides.rubyonrails.org/working_with_javascript_in_rails.html

+0

谢谢!在<%= j render“appointements”%>'中的“j”是什么? – tfantina

+0

由于ERB是文件嵌入,所有Ruby代码都被转换为文件内容。我们希望文件内容是一个JS字符串“

”。这将告诉ERB不要把它写成文件内容,而应该写成JS代码:)如果我们没有,并且HTML部分内容有一个''/ n“'换行符,那么这将成为文件中的换行符,而不是一个包含'“/ n”'的JS字符串。 – fbelanger