【问题标题】:Moving rails from to from _form.html.erb to application.html.erb将 rails 从 _form.html.erb 移动到 application.html.erb
【发布时间】:2014-07-24 02:24:33
【问题描述】:

我已经为网站完成了大部分功能。现在我试图让它看起来不错。我有一个很好用的 _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。我正在使用引导程序并决定使用导航栏。我已将导航条码放入 application.html.erb。它工作得很好,很好。我想要通常是搜索功能的添加新卡。

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

我正在尝试边做边学,但我遇到了困难,需要一些帮助。

谢谢你, 伊恩

【问题讨论】:

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


    【解决方案1】:

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

    好吧,如果你想把这个表单放在另一个视图中,比如在 application.html.erb 中,你需要首先设置你的 @card 变量,所以你可以这样做:

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

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

    【讨论】:

      【解决方案2】:

      @instance_variable

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

      你遇到的问题是你直接在你的部分引用了一个 @instance_variable

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

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

      这依赖于使 @card 实例变量可用,如果您将部分加载到除 cards_controller 之外的任何其他控制器中,则不会出现这种情况。

      --

      修复

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

      这将允许您在局部变量中使用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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-07-29
        • 2015-06-22
        • 1970-01-01
        • 2012-01-28
        • 2012-06-03
        相关资源
        最近更新 更多