2013-04-09 120 views
1

我使用的内部视图文件(index.html.erb)button_to标签下面Ruby on Rails的更新页面,AJAX

<textarea rows="2" cols="20"><%[email protected]_date%></textarea> 

<%= button_to t(:get_date_write_new),channel_get_dates_path(@channel, :write => 1) %> 

当我点击按钮,它会从设备获取日期并打印在屏幕上。

我的问题是,如何连续调用函数“channel_get_dates_path(@channel,:write => 1)”,并在不刷新页面的情况下在textarea中显示日期。只按一次按钮?

我控制文件:

class GetDatesController < ApplicationController 
    include DateUtilities 

    before_filter :require_user, :set_channels_menu 
    def index 
    @channel  = current_user.channels.find(params[:channel_id]) 
    @write_date = @channel.get_dates.write_dates.first 
    end 

    def create 
    @channel = current_user.channels.find(params[:channel_id]) 
    @get_date = @channel.get_dates.write_dates.first 

    if (@get_date.nil?) 
     @get_date = GetDate.new 
     @get_date.channel_id = @channel.id 
     @get_date.user_id = current_user.id 
     @get_date.write_flag = params[:write] 
    end 

    @get_date.get_date = generate_get_date 
    @get_date.save 

    redirect_to channel_get_dates_path(@channel) 
    end 
end 

和我有日期生成文件(MyApp的/ lib中)为:

module DateUtilities 

    def generate_get_date 

    require 'rubygems' 

    require 'socket' 

    hostname = '127.0.0.1' 

    port  = 2000 
    streamSock = TCPSocket.new(hostname, port) 
    streamSock.write "ON" 
    while line = streamSock.gets 
     k = line 
    end 
    k 
    end 
end 
+0

你需要为这种情况使用AJAX然后 – swapnesh 2013-04-09 12:08:09

+0

为什么你需要显示日期,如果用户不会编辑它。可能它很容易在控制器操作中创建日期? – itsnikolay 2013-04-09 12:39:44

+0

@deepak,同时在你的问题中编辑格式,我注意到你正在使用制表符缩进。标准的ruby格式是为每个缩进使用2个空格:你可以在你的IDE的设置中改变这个 – 2013-04-09 12:52:47

回答

0

为了改变页面而不刷新它,你需要AJAX。

很容易地在轨道在一个形式传递:remote => true属性,这是可以做到:

<%= form_tag(myupdate_path, :remote => true) do %> 
    <%= form_tag(channel_get_dates_path(@channel, :write => 1), :remote => true) do %> 
    <input type="submit" value="Get Today's Date"> 
    <input id="thedate" type="text" value="<%[email protected]_date%>"> 
    <% end %> 
<% end %> 

远程选项将调用您的控制器的myupdate方法,并告诉它渲染JavaScript的视图代替一个html视图。比方说,你在你的控制器:

def myupdate 
    @thedate = params['wathever'] # get the params from the form 
end 

然后你就可以在myController的/ myupdate.js.erb(而不是myupdate.html.erb)添加JavaScript方法。您正在使用jQuery假设,这将是

$("#thedate").val("<%= @thedate %>") # dynamically update 

通过这样做,你能够从形式获得参数,可以处理它,你想用一个控制器,并告诉JavaScript来更新根据自己的网页无论你放在你的实例变量中。

编辑:我用你的表单作为例子。希望javascript现在更加清晰:javascript视图的想法是在页面中获取“thedate”html元素,并根据更新的实例变量@thedate设置其值。这是你告诉javascript动态更新你的页面的地方。

希望这会有帮助

+0

感谢宝贵的建议,现在我能够在不刷新页面的情况下在文本字段中获取日期。 – deepak 2013-04-15 07:39:07

+0

我还有一个问题, 每当我按下按钮,它将调用控制器中的方法,并在文本框中显示日期,而无需任何页面刷新, 是否可以通过按按钮使文本字段中持续显示日期只有一次? 我试着在一个循环内调用Controller方法,并以双重渲染错误结束。它是正确的方式还是在视图文件中进行更改? – deepak 2013-04-15 13:23:27

0

@ Aurel,谢谢你的建议。我遵循你的步骤。

在我看来,文件

改变了代码为:

<%= form_tag(channel_get_dates_path(@channel, :write => 1), :remote => true) do %> 
    <input type="submit" value="Get Today's Date"> 
    <input type="text" value="<%[email protected]_date%>"> 
    <% end %> 

在此之后,当我按下提交按钮更新方法被调用(我可以看到,设备发送的日期),但日期不显示在文本字段中。当我刷新页面时,从设备获取的最后一个日期显示在文本字段中。 每次按提交按钮时是否可以显示日期?