2

我是 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>

现在我很困惑我该怎么做。我考虑过只使用控制器的 create - 方法(或任何方法),它执行以下操作:

def match

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

但这似乎让我接受了控制器的新方法或类似的东西。

所以,有了这个解释(这也许也揭示了我的知识水平......)有人可以告诉我我是否真的在使用 Rails 做错了什么,或者我是否只需要为此使用 javascript?

一些示例代码(用于 Rails 和/或 JS)将不胜感激!(请保持简单,我知道 Ajax 等是最先进的,但我只是想让它运行 :-))...还链接到代码示例,它只在 Rails 上显示这样的项目(简单地说:- ) ) 会非常好!

4

2 回答 2

1

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

要回答您的一个问题,link_to method这不是指您尝试调用的操作,而是指 HTTP 方法,例如“POST”、“GET”、“PUT”、“DELETE”。您应该使用:action来告诉控制器(方法)中要执行的操作。

有几个地方可以帮助您开始使用 Ruby 和 Rails。

  • Code School - Code school 有一些免费课程,其中一门恰好是 Ruby on Rails 上非常好的一门
  • Code Academy - Code Academy 比 Code School 更加结构化,并且仍然提供许多关于不同 Web 开发技术的课程
  • Railscasts - Railscasts 是一个很棒的网站,有一些免费的 Rails 教程视频

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

于 2012-12-04T21:23:49.210 回答
1

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

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

再培训局:

# 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 中是隐藏的,当用户单击“购买我!”时会显示该表单。相关文章的按钮。

这种方法也可以稍作调整,以允许用户通过稍微移动表单声明并在 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 %>

这可能不准确,但我希望它为您指明正确的方向!

于 2012-12-04T21:56:34.330 回答