如何调用参数来自 Ruby 模型的 javascript 函数?

Posted

技术标签:

【中文标题】如何调用参数来自 Ruby 模型的 javascript 函数?【英文标题】:How to call a javascript function whose parameters are from a Ruby model? 【发布时间】:2016-03-23 21:29:02 【问题描述】:

这就是我到目前为止所得到的:用户将转到一个视图并单击一个“创建事件”按钮,该按钮将在我的事件表中保存一个带有 starts_at 和 ends_at 日期的事件。

当用户点击创建事件时,该事件在事件控制器中被创建:

class EventsController < ApplicationController
  before_filter :logged_in?


  def new
    @event = Event.new
    @calendar = current_customer.calendar

  end


  def create

    @calendar = current_customer.calendar

    @event = @calendar.events.build(event_params)
    if @event.save
      redirect_to '/main'
    else
      redirect_to '/compose'
    end
  end

  private
  def event_params
    params.require(:event).permit(:calendar_id, :name, :starts_at, :ends_at) 
  end

用户会被自动发送到他们的主页 (/main)。这是 html 日历所在的位置。 javascript 函数将在我的 application.js 文件中,而日历 html 将在我的 main.html.erb 文件中。

我想要做的是能够在创建事件时调用一个 javascript 函数,该函数将更改用户主页上的 html 日历以显示事件(只是用红色遮住日期和时间)。 javascript 函数需要接收新创建的事件的参数(starts_at、ends_at)才能工作(我认为)。

我对 ruby​​ on rails、javascript 和 html 非常陌生,所以如果你有一个有用的答案,请像我 5 岁一样解释!!

编辑:这是我用来链接到事件控制器的创建方法的视图代码:

<div class="jumbotron">

  <div class="container">
    <div class="form">
      <h1>Create A Meeting</h1>

      <%= form_for(@event) do |f| %>

          <%= f.text_field :name, :placeholder => "Title" %>
          <!--< f.collection_select :location, Location.all, :id, :locName %> FOR WHEN LOCATIONS ARE A THING-->
          <!--< f.text_field :body, :placeholder => "Short Description" %> NEXT STEP -->

          <div>
            <h2>when do you want it to start?</h2>
            <%= f.datetime_select :starts_at, :placeholder => "when do you want it?"   %>
          </div>



          <div>
            <h2>when do you want it to end?</h2>
            <%= f.datetime_select :ends_at, :placeholder => "when should it end?"  %>
          </div>


          <%= f.submit "Create Meeting", class: "btn-submit" %>
      <% end %>
    </div>
  </div>
</div>

Pages 控制器(生成 main 的地方):

class PagesController < ApplicationController

  #before_action :require_customer, only: [:main]

  def home

  end


  def main

  end

end

路由文件:

Rails.application.routes.draw do

  root 'pages#home'
  get '/main' => 'pages#main'
  get '/signup' => 'customers#new'
  resources :customers, :calendars

  get '/signupbus' => 'businesses#new'
  resources :businesses

  get '/login' => 'sessions#new'
  post 'login' => 'sessions#create'
  delete 'logout' => 'sessions#destroy'

  get '/compose' => 'events#new'
  resources :events

这里是我每周日历视图的 html 的 sn-p(我知道这很糟糕,但我不知道如何让它变得更好):

</div>

<div class="jumbotron">

  <div class="container">
    <div class="main2">

      <a class="btn-main" href="/compose">Create a Meeting</a>

    </div>
  </div>
</div>



<div class = "calendarContainer">

<table class= "weeklyCalendar">
  <tr>
    <td class = "blankTopLeft">
    </td>
    <td class = "daytd" width=75 valign=top >
      <p class=MsoNormal><i><span style='font-size:13.0pt;font-family:"Calibri Light",sans-serif'>Mon</span></i></p>
      <p class=MsoNormal><i><span style='font-size:13.0pt;font-family:"Calibri Light",sans-serif'>14</span></i></p>
    </td>
    <td class = "daytd" width=75 valign=top>
      <p class=MsoNormal ><i><span style='font-size:13.0pt;font-family:"Calibri Light",sans-serif'>Tue</span></i></p>
      <p class=MsoNormal ><i><span style='font-size:13.0pt;font-family:"Calibri Light",sans-serif'>15</span></i></p>
    </td>
    <td class = "daytd" width=75 valign=top>
      <p class=MsoNormal><i><span style='font-size:13.0pt;font-family:"Calibri Light",sans-serif'>Wed</span></i></p>
    </td>
    <td class = "daytd" width=75 valign=top>
      <p class=MsoNormal><i><span style='font-size:13.0pt;font-family:"Calibri Light",sans-serif'>Thu</span></i></p>
    </td>
    <td class = "daytd" width=75 valign=top>
      <p class=MsoNormal style='margin-bottom:0cm;margin-bottom:.0001pt;line-height:
              normal'><i><span style='font-size:13.0pt;font-family:"Calibri Light",sans-serif'>Fri</span></i></p>
    </td>
    <td class = "daytd" width=75 valign=top>
      <p class=MsoNormal style='margin-bottom:0cm;margin-bottom:.0001pt;line-height:
              normal'><i><span style='font-size:13.0pt;font-family:"Calibri Light",sans-serif'>Sat</span></i></p>
    </td>
    <td class= "daytd" width=75 valign=top>
      <p class=MsoNormal style='margin-bottom:0cm;margin-bottom:.0001pt;line-height:
              normal'><i><span style='font-size:13.0pt;font-family:"Calibri Light",sans-serif'>Sun</span></i></p>
    </td>
  </tr>
  <tr class = "Monday" style='height:28.05pt'>
    <td class = "timetd" width=75 valign=top>
      <p class=MsoNormal align=right style='margin-bottom:0cm;margin-bottom:.0001pt;
              text-align:right;line-height:normal'><i><span style='font-size:13.0pt;
              font-family:"Calibri Light",sans-serif'>  9:00  </span></i></p>
    </td>
    <td id = "mon900" class ="freeslot" width=75 valign=top>
      <p class=MsoNormal style='margin-bottom:0cm;margin-bottom:.0001pt;line-height:
              normal'>&nbsp;</p>
    </td>
    <td id = "tue900" class ="freeslot" width=75 valign=top>
      <p class=MsoNormal style='margin-bottom:0cm;margin-bottom:.0001pt;line-height:
              normal'>&nbsp;</p>
    </td>
    <td id = "wed900" class = "freeslot" width=75 valign=top>
      <p class=MsoNormal style='margin-bottom:0cm;margin-bottom:.0001pt;line-height:
              normal'>&nbsp;</p>
    </td>
    <td id = "thu900" class = "freeslot" width=75 valign=top>
      <p class=MsoNormal style='margin-bottom:0cm;margin-bottom:.0001pt;line-height:
              normal'>&nbsp;</p>
    </td>
    <td id = "fri900" class = "freeslot" width=75 valign=top>
      <p class=MsoNormal style='margin-bottom:0cm;margin-bottom:.0001pt;line-height:
              normal'>&nbsp;</p>
    </td>
    <td id = "sat900" class = "freeslot" width=75 valign=top>
      <p class=MsoNormal style='margin-bottom:0cm;margin-bottom:.0001pt;line-height:
              normal'>&nbsp;</p>
    </td>
    <td id = "sun900" class = "freeslot" width=75 valign=top>
      <p class=MsoNormal style='margin-bottom:0cm;margin-bottom:.0001pt;line-height:
              normal'>&nbsp;</p>
    </td>
  </tr>
  <tr style='height:27.75pt'>
    <td class = "timetd" width=75 valign=top>
      <p class=MsoNormal align=right style='margin-bottom:0cm;margin-bottom:.0001pt;
              text-align:right;line-height:normal'><i><span style='font-size:13.0pt;
              font-family:"Calibri Light",sans-serif'>10:00</span></i></p>
    </td>

【问题讨论】:

您的意思是说,一旦您创建了应该在主 html 页面的日历中可见的事件。请确认。 @Bharatsoni 是的,这就是我的意思 我不知道你为什么需要 javascript 来做这个?如果你在数据库中存储了新事件然后重定向到主页面,主页面将被重建,包括新创建的事件?我错过了什么吗? @BroiSatse 我的所有主页目前包含的是一个绘制的html日历,html与事件模型或日历模型之间没有任何联系。这就是我要建立的,以便在创建事件时,相应地更改 html 好的,我知道现在发生了什么。你不需要 JS。你不需要format.js。您需要做的就是在您的PagesContrller 中从您的main 方法重新加载事件。 【参考方案1】:

在使用 Controller 中现有的 create 方法创建新事件后,您重定向到 PagesControllermain 方法,然后,您将不得不在您的 @987654325 中重新加载 event @方法。

为此,您需要知道所需event 中的id,这意味着您必须从您要重定向的任何地方传递它,这意味着您必须在您的路线中为它腾出空间对于main 方法。

所以,在你的路线上:

get '/main/:callendar_id' => 'page#main'

然后从您的 create 方法中,您使用新创建的事件的 id 重定向到此路径。

 def create

    @calendar = current_customer.calendar

    @event = @calendar.events.build(event_params)
    if @event.save
      redirect_to "/main/#@callendar.id"
    else
      redirect_to '/compose'
    end
  end

并从您的PagesControllermain 方法重新加载事件:

def main
  @callendar = Callendar.find(params[:callendar_id])
end

这很适合您,并在您的 main 页面上为您提供更新后的日历以及新事件。

【讨论】:

我对AJAX不是很熟悉,其实我之前没用过。我将如何使用 JS 调用创建方法/保存新事件?该事件还会出现在我的数据库中吗? 是的。您只需将remote: true 属性添加到您当前用于创建事件的链接。我的意思是用户单击以创建事件的链接。如果您放弃此链接的代码,我可以向您展示如何操作,并帮助更新上述创建操作。 好的,非常感谢,我已将代码添加到问题的末尾 所以现在在 create.js.erb 文件中,我可以放任何我喜欢的 javascript 吗?所以因为我想改变 html 的外观,我可以在那个文件中做所有的 jquery 调用? 另外,在添加你给我的代码后,现在当我点击“创建会议”按钮时,我并没有返回到我之前的主页,这是为什么?跨度>

以上是关于如何调用参数来自 Ruby 模型的 javascript 函数?的主要内容,如果未能解决你的问题,请参考以下文章

一篇文章带你搞清Ruby对象模型

如何运行使用我的 Rails 模型的 Ruby 任务?

错误请求尝试使用来自 ruby​​ 的 Digest Auth 调用服务

ruby 方法中如何使用符号来识别参数

如何运行一个ruby类 中的方法

Ruby on Rails - 来自 Paypal 的参数:utf-8 中的无效字节序列