Ruby on rails 将Rails表单部分嵌入到另一个页面中
我正在构建一个rails 4.2.0应用程序,其中包含一个contact us页面(该页面确实有一个半空的控制器)。我正在尝试嵌入来自另一个控制器的部分表单 以下是代码(减去文本): 及查询主任:Ruby on rails 将Rails表单部分嵌入到另一个页面中,ruby-on-rails,ruby,forms,Ruby On Rails,Ruby,Forms,我正在构建一个rails 4.2.0应用程序,其中包含一个contact us页面(该页面确实有一个半空的控制器)。我正在尝试嵌入来自另一个控制器的部分表单 以下是代码(减去文本): 及查询主任: class EnquiriesController < ApplicationController before_action :set_enquiry, only: [:show, :edit, :update, :destroy] # GET /enquiries def ind
class EnquiriesController < ApplicationController
before_action :set_enquiry, only: [:show, :edit, :update, :destroy]
# GET /enquiries
def index
@enquiries = Enquiry.all
end
# GET /enquiries/1
def show
end
# GET /enquiries/new
def new
@enquiry = Enquiry.new
end
# GET /enquiries/1/edit
def edit
end
# POST /enquiries
def create
@enquiry = Enquiry.new(enquiry_params)
if @enquiry.save
redirect_to @enquiry, notice: 'Enquiry was successfully created.'
else
render :new
end
end
# PATCH/PUT /enquiries/1
def update
if @enquiry.update(enquiry_params)
redirect_to @enquiry, notice: 'Enquiry was successfully updated.'
else
render :edit
end
end
# DELETE /enquiries/1
def destroy
@enquiry.destroy
redirect_to enquiries_url, notice: 'Enquiry was successfully destroyed.'
end
private
# Use callbacks to share common setup or constraints between actions.
def set_enquiry
@enquiry = Enquiry.find(params[:id])
end
# Only allow a trusted parameter "white list" through.
def enquiry_params
params.require(:enquiry).permit(:subject, :e_description)
end
end
class PagesController < ApplicationController
around_filter :resource_not_found
# def home
# end
private
# If resource not found redirect to root and flash error.
# => For pages this will rarely be needed as it should 404.
def resource_not_found
yield
rescue ActiveRecord::RecordNotFound
redirect_to root_url, :notice => "Page not found."
end
end
def new
@enquiry = Enquiry.new
render 'pages/contactus'
end
它告诉您,
@enquiry
在试图呈现表单时为零。您需要调用new
操作来创建要表示的表单的@enqiury
您可以将路线更改为:
get 'pages/contactus' => 'enquiries#new'
然后在你的询问中:
class EnquiriesController < ApplicationController
before_action :set_enquiry, only: [:show, :edit, :update, :destroy]
# GET /enquiries
def index
@enquiries = Enquiry.all
end
# GET /enquiries/1
def show
end
# GET /enquiries/new
def new
@enquiry = Enquiry.new
end
# GET /enquiries/1/edit
def edit
end
# POST /enquiries
def create
@enquiry = Enquiry.new(enquiry_params)
if @enquiry.save
redirect_to @enquiry, notice: 'Enquiry was successfully created.'
else
render :new
end
end
# PATCH/PUT /enquiries/1
def update
if @enquiry.update(enquiry_params)
redirect_to @enquiry, notice: 'Enquiry was successfully updated.'
else
render :edit
end
end
# DELETE /enquiries/1
def destroy
@enquiry.destroy
redirect_to enquiries_url, notice: 'Enquiry was successfully destroyed.'
end
private
# Use callbacks to share common setup or constraints between actions.
def set_enquiry
@enquiry = Enquiry.find(params[:id])
end
# Only allow a trusted parameter "white list" through.
def enquiry_params
params.require(:enquiry).permit(:subject, :e_description)
end
end
class PagesController < ApplicationController
around_filter :resource_not_found
# def home
# end
private
# If resource not found redirect to root and flash error.
# => For pages this will rarely be needed as it should 404.
def resource_not_found
yield
rescue ActiveRecord::RecordNotFound
redirect_to root_url, :notice => "Page not found."
end
end
def new
@enquiry = Enquiry.new
render 'pages/contactus'
end
编辑:
好的,现在我们结合Friends Systems在他的回答中所说的:
<% if user_signed_in? %>
<%= render 'enquiries/form' enquiry: @enquiry %>
<% end %>
现在将表单中的@enquiry
实例更改为enquiry
这是因为您需要将变量传递给分部。问题是,您的@enquiry变量没有在呈现分部的上下文中定义。 它不是由被调用的控制器操作定义的,您应该通过调用
@enquiry = Enquiry.new
在你的行动中
另外
要在其他地方使用它,我会将@enquiry实例变量作为区域设置变量传递给partial
<% render 'enquiries/form', :enquiry => @enquiry %>
如果@enquiry为零,则在您的表单中创建一个新实例,使舒尔成为部分。假设
@enquiry
由另一个控制器生成,您是否尝试过类似
的方法?您需要在表单中将/alias@enquiry
重命名为enquiry
。否则,请尝试Beartech为@enquiry | | enquiry.new提供的表单。\n您可以发布您试图重新使用部分的oth控制器吗?@FriendsSystems我已经添加了pages控制器。也尝试了你的建议,但我仍然得到表单中的第一个参数不能包含nil或为空“
错误。我不是专家,但调用查询“正确”吗。表单中的新方法?我以前没有见过这种情况,所以不确定这是否是一种常见模式。@Beartech从我所阅读的内容来看,这不是最佳实践,因为它“消除”了对控制器的需要。这就是我问这个问题的原因。实际上,我是针对@friends systems的,因为他们建议这样做。但是,是的,这就是为什么乍一看它似乎不太像铁路。这种调用应该在控制器中。@Beartech你是对的,它应该在控制器中,但是如果这个部分在不同的上下文中重复使用多次,if会按照我说的方式来做,以保持我的控制器干净。好的,我已经做了所有这些。链接用于测试。现在我只有
页面加载,但没有显示任何表单。您可以发布web服务器控制台以了解您现在得到的信息吗?我想知道,在调用显式路径时,您是否必须使用查询/_表单
?嗯。不确定它为什么在页面之前呈现表单。。。让我看看我的一个应用程序。好吧,我想这是因为我在中遗漏了=
。是的,肯定有更多的“rails式”方法可以做到这一点。您最终可能会考虑重构。由于是用户登录,您可以让一个用户拥有许多:查询
,并且查询属于用户。这就是接受嵌套属性的地方,然后使用资源路由、嵌套表单等。。。
<% render 'enquiries/form', :enquiry => @enquiry %>
<%= form_for enquiry do |f| %>
...
<% end %>
@enquiry ||= Enquiry.new