Ruby on Rails:无需JavaScript即可创建数据库条目

时间:2012-12-04 21:14:47

标签: javascript ruby-on-rails-3 rest web-applications methods

我是Web开发的新手,并尝试使用Ruby on Rails(3.2.9)开始一个项目。 所以,我对RoR在没有JavaScript的情况下可以做什么感到有点困惑...... 例如,使用Rails Scaffold,通过访问Controller的新方法(然后调用create方法并将记录保存到数据库)在数据库中创建新记录没有问题。 我现在想要创建新记录而不使用它的视图。 就像“用户点击按钮 - >保存记录”之类的东西 我会给你一个例子(我需要这个用于我的学习,这不是一个真实的生活项目......)

我有一个显示我所有文章的视图(rails生成脚手架文章),现在添加了一个链接到“购买方法”,显示文章名称和可用金额。 在下面有一个字段,顾客可以在其中选择他想要购买的物品的数量。

<p>
  <b>Name:</b>
  <%= @article.name %>
</p>

<p>
  <b>Available:</b>
  <%= @article.stocks %>
</p>

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

 <div class="field">
    <b>How many?</b>
    <br />
    <%= f.number_field :amount %>
  </div>
<% end %> 

现在我想添加一个链接(或者我认为更好的按钮),这会导致一个事件,将文章的名称和选定的金额转换为订单项,即在order_item表中创建记录。

<td><%=link_to "Ja", :controller => "oderItem", :method => "create" %></td><br>

现在我对如何做到这一点很困惑。 我想过只使用Controller的create - Method(或任何方法),它可以执行以下操作:

def match

    @apo = OrderItem.new(:amount :2, ...)
    @apo.save
end

但这似乎只是让我转向控制器的新方法,或者像那样。

所以,通过这些解释(也许可以揭示我的知识水平......)任何人都可以告诉我,如果我正在做一些与rails真正的错误或者我只是必须使用javascript这个??? / p>

一些示例代码(对于Rails和/或JS)最受欢迎! (请保持简单,我知道Ajax等是最先进的,但我只是想让这个运行:-)) ...还链接到Code-Samples,它只是在Rails上显示这样的项目(简称:-))会非常好!

2 个答案:

答案 0 :(得分:1)

Ruby on Rails不依赖于Javascript,因此您无需了解Javascript即可学习Ruby和Rails。

要回答您的一个问题,link_to method不会引用您尝试调用的操作,而是引用HTTP方法,例如“POST”,“GET”,“PUT” ,“删除”。您应该使用:action来告知控制器(方法)中的哪个操作。

有一些地方可以让你开始使用Ruby和Rails。

  • Code School - 代码学校有一些免费课程,其中一个在Ruby on Rails上恰好是一个很好的课程
  • Code Academy - 代码学院比代码学院更有条理,并且仍然提供许多关于不同Web开发技术的课程
  • Railscasts - Railscasts是一个很棒的网站,有一些免费的rails教程视频

也许有些人可以详细说明更多来源。此外,Github有许多开源项目,您可以查看这些项目,并了解人们如何使用Ruby和Rails。

答案 1 :(得分:1)

为了更改页面布局以显示“迷你”表单以响应用户单击特定元素,您将需要呈现新视图,或通过JavaScript修改当前文档。 / p>

如果您选择通过JavaScript显示表单,则以下是此视图代码的简化版本:

ERB:

# rendering each available article...
<% @articles.each do |article| %>

  <p>
    <b>Name:</b>
    <%= article.name %>
  </p>

  <p>
    <b>Available:</b>
    <%= article.stocks %>
  </p>

  <% button_tag(:type => 'button', :class => 'buy-btn', data-article-id="article.id") do %>
    <strong>Buy Me!</strong>
  <% end %>

  # for each article, create a mini form with which
  # the user can buy n of said article...
  <div class="field hidden-item" id="form-#{article.id}" >
    <%= form_for(OrderItem.new do |f| %>   
      <b>How many?</b>
      <br />
      <%= f.number_field_tag :amount%>
      <%= f.submit %>    
    <% end %> 
  </div>
<% end %>

CSS:

.field {
  display: none; //hides the div from all browsers by default
}

JavaScript帮助将所有内容联系在一起:

$(document).ready(function() {
  //... other js code

  // bind all elements with the css class 'buy-btn' to 
  // a click event...
  $(".buy-btn").bind('click', function() {
      var id = $(this).data('article-id');
      $("#form-" + id).slideDown(); // shows the selected element with a nice slide down effect
  });

  //... other js code

});

因此,在ERB中,我们为每篇文章提供一个等待填充和提交的迷你表格。该表单默认隐藏在我们的CSS中,当用户点击“Buy Me!”时可以看到该表单。相关文章的按钮。

这种方法也可以进行一些调整,以允许用户通过稍微移动表单声明,并在OrderItemsController.create操作中进行适当的处​​理来订购他们想要的许多不同的文章。

要记住的另一件事是单击表单上的提交按钮将导致页面默认重定向。这可能就是你刚刚开始时想要离开它的方式,但是当你开始变得舒服时,请查看如何在提交标签上使用:remote => true以允许通过AJAX在后台提交表单。

如果您真的想要在没有任何JavaScript的情况下这样做,您将要么必须使用CSS做一些非常高级的工作,要么必须安装一个链接,将一个参数传递给您的视图,指示它显示一种特殊的形式。这可能是这样的:

# rendering each available article, as before...
<% @articles.each do |article| %>

  <p>
    <b>Name:</b>
    <%= article.name %>
  </p>

  <p>
    <b>Available:</b>
    <%= article.stocks %>
  </p>

  # ... but now set up a link that passes a param to the controller...
  <%= link_to( 'Buy Me!', "/articles?article=#{article.id}" ) %>

  # which we then use to render a form on the page if the id in the
  # 'article' param matches the id of the article we are currently
  # rendering...
  <% if params[:article] && params[:article] == article.id %>

    <%= form_for(OrderItem.new do |f| %>   
      <b>How many?</b>
      <br />
      <%= f.number_field_tag :amount%>
      <%= f.submit %>    
    <% end %> 
  </div>
<% end %>

这可能不准确,但我希望它指出你正确的方向!