Ruby on rails 将Rails表单部分嵌入到另一个页面中

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

我正在构建一个rails 4.2.0应用程序,其中包含一个contact us页面(该页面确实有一个半空的控制器)。我正在尝试嵌入来自另一个控制器的部分表单

以下是代码(减去文本):

及查询主任:

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