将rails从_form.html.erb移动到application.html.erb

时间:2014-07-24 02:24:34

标签: ruby-on-rails forms twitter-bootstrap

我为网站完成了大部分功能。现在我想让它看起来不错。我有一个非常好的_form.html.erb。

<%= form_for(@card) do |f| %>
<% if @card.errors.any? %>
<div id="error_explanation">
  <h2><%= pluralize(@card.errors.count, "error") %> prohibited this card from being saved:</h2>

  <ul>
    <% @card.errors.full_messages.each do |msg| %>
    <li><%= msg %></li>
    <% end %>
  </ul>
</div>
<% end %>

<div class="field">
  <%= f.label :event %><br />
  <%= f.text_field :event %>
</div>
<div class="actions">
  <%= f.submit %>
</div>
<% end %>

文件

view
- cards
-- new.html.erb
-- index.html.erb
-- show.html.erb
- layouts
-- application.html.erb
- pages
-- index.html.erb

我调用new.html.erb中的表单,它可以将其发送到show.html.erb,就像我想要的那样。我正在使用bootstrap并决定使用导航栏。我已将导航条形码放入application.html.erb。它工作得很好,很好。我希望通常的搜索功能是添加一张新卡。

当我添加表单调用时,它不起作用,当我将它直接添加到应用程序页面时,它不起作用。我不确定,我花了好几个小时。我让它只在show.html.erb页面上工作,两个索引页面都会出错。老实说,我不记得我是怎么做到的。

我正在努力学习,但我被困住了,需要一些帮助。

谢谢你,     伊恩

2 个答案:

答案 0 :(得分:1)

我想当你说它在你的new.html.erb中工作时,你的new内有cards_controller个动作,并且在这个动作中你有类似的东西:@card = Card.new

好吧,如果您想将此表单放在另一个视图中,就像在application.html.erb中一样,您需要首先设置@card变量,这样您就可以执行以下操作:

# application_controller:
before_filter :new_card
def new_card
  @card = Card.new
end

请注意,从应用程序控制器继承的所有控制器都将设置此@card变量

答案 1 :(得分:0)

<强> @instance_variable

这里的根本问题是您正在调用partial - 按设计,这些是为了让您能够调用文件中包含的功能应用

您遇到的问题是您在部分内容中直接引用了 @instance_variable

这通常不是问题 - 如果你像原来一样使用偏见(模块化视图),它应该没问题。当您尝试以更一般化的方式使用部分时会出现问题,就像您现在所做的那样:

#app/views/controller/_form.html.erb
<%= form_for(@card) do |f| %>

这依赖于@card实例变量可用,如果您在cards_controller以外的任何其他控制器中加载部分,则不会有。

-

<强>修正

解决此问题的方法是在应用程序控制器中填充@card实例变量(如edymerchk所述),或者通过locals哈希传递原始值。 partial来电:

这样您就可以在部分中使用card 本地变量

#app/views/controller/_form.html.erb
<%= form_for card do |f| %>

-

或者,您也可以按照另一个答案中的建议设置@card实例变量:

#app/controllers/application_controller.rb
Class ApplicationController < ActionController::Base
   before_action :set_card

   private

   def set_card
      @card = Card.new
   end
end