我是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上显示这样的项目(简称:-))会非常好!
答案 0 :(得分:1)
Ruby on Rails不依赖于Javascript,因此您无需了解Javascript即可学习Ruby和Rails。
要回答您的一个问题,link_to
method
不会引用您尝试调用的操作,而是引用HTTP方法,例如“POST”,“GET”,“PUT” ,“删除”。您应该使用:action
来告知控制器(方法)中的哪个操作。
有一些地方可以让你开始使用Ruby和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 %>
这可能不准确,但我希望它指出你正确的方向!