Rails使用新的和编辑表单的布局

时间:2016-02-04 11:08:55

标签: ruby-on-rails forms layout

在我的应用程序中,我有一个新动作的表单,与我的编辑表单相同,相隔四或五行。

我遇到的问题是我的new.html.haml给了我一个错误,解释说它不知道“f”是什么。

f是“form_for @object do | f |”中的一个。

显然在我的新作品中,form_for的对象与编辑对象不同。

我认为这应该是一种常见的行为,但我似乎无法在rails文档中找到任何符合我需求的内容。

这是代码的快速示例

#new.html.haml
%div{ id: "StaticForms" }
 = f.label :project_id
 = f.collection_select :project_id, @projects, :id, :name,
 { selected: @edit.task.project_id },
 { class: "form-control", onchange: 'get_projects(this.options[this.selectedIndex].value);' }
 - index = 1
 - @project_tree.each do |task|
   = render partial: "edit", locals: {task: task, index: index} // render here was okay before "layouting"
   - index += 1

 #form_layout.html.haml%html
 %div{ :class => "col-md-12" }
   %h2 Reporting
     %div{ :id => "Form"}
       = form_for @activity do |f|

       = f.label :consultant_id
       = f.collection_select :consultant_id, @consultants, :id, :name,
       { selected: current_user.consultant.id },
       { class: "form-control" }

       = yield

你可以在new.html.haml文件中看到的JS标签“onchange:...”应该由我在布局文件fyi中的JS触发。

我遇到的错误是:“未定义的局部变量或方法`f'代表#<#:0x007feb84e6b848>”

有人可以提供链接或解释吗? :)

谢谢。 最好的问候。

编辑:添加了一些代码,并不认为它与此类问题相关:>

2 个答案:

答案 0 :(得分:0)

#app/views/activities/_form.haml
= form_for activity do |f|
   = f.label :consultant_id
   = f.collection_select :consultant_id, @consultants, :id, :name,
       { selected: current_user.consultant.id },
       { class: "form-control" }
   ...

#app/views/activities/new.haml
= render "form", activity: @activity

#app/views/activities/edit.haml
= render "form", activity: @activity

答案 1 :(得分:0)

所以我最终解决了我的问题,我能够解决它。

新视图和编辑视图:

= render layout: 'form_activity', locals: {activity: @object} do |f| # here @objet depends on the controller method i.e. @activity for new, @edit for edit
  = f.label ...
  ...

#relativly the same code in edit and new

_from_activity.html.haml(与上述视图位于同一文件夹中):

= form_for activity do |f|
... # some form stuff
= yield f # here i get back to new or edit code
... # some stuff - rest of the form.

这完美无缺!

布局内容 - 在收益之前。

-

查看内容 - 感谢线:1)渲染布局:...执行| f |在视图中,2)在布局中产生 f

-

布局内容 - 收益后。

感谢所有人的回答。

顺便说一句,我知道第一个问题并不是问我刚发布的结果。如果是这样,我道歉:/

最好的问候。