[英]How do I render a partial containing a form_for for an edit function?
我在父视图中有一个div
,它可以部分show
。 在此show
partial中,我有一个按钮,该按钮应更改父对象的partial以呈现“ form”部分以编辑对象,但是由于“ form”部分的form_for
似乎缺少@project
对象,所以我一直感到@project
。
如何将该对象传递给“表单”部分? 我还有其他东西吗?
我对使用AJAX很陌生。 如果您需要,很高兴提供更多信息。
我在服务器终端中遇到的错误是
ActionView::Template::Error (First argument in form cannot contain nil or be empty):
routes.rb
get 'switchProjectView', to: 'projects#switch_main_view'
resources :projects
projects_controller.rb
class ProjectsController < ApplicationController
def new
@project = Project.new
end
def create
@project = Project.new(project_params)
if @project.save
flash[:success] = "New Project Added"
redirect_to @project
else
flash[:danger] = "Project Not Added. Please Try Again"
end
end
def show
@project = Project.find(params[:id])
end
def index
@projects = Project.all
end
def update
@project = Project.find(params[:id])
if @project.update_attributes(project_params)
redirect_to @project
else
render 'edit'
end
end
def edit
end
def switch_main_view
respond_to do |format|
format.html
format.js
end
end
def project_params
params.require(:project).permit(:main_contact_name, :id, :main_contact_phone, :main_contact_email, :project_name)
end
end
show.html.erb
<div class="body">
<div class="center jumbotron heading-jumbo">
<h1><%= @project.project_name %></h1>
</div>
<div class="body-jumbo jumbotron" id='project-details'>
<%= render "projects/show" %>
</div>
</div>
switch_main_view.js.erb
$('#project-details').html("<%= j render :partial => 'projects/form' %>");
_form.html.erb
<%= form_for(@project) do |f| %>
<%= f.label :project_name %>
<%= f.text_field :project_name, class: 'form-control'%>
<%= f.label :main_contact_name %>
<%= f.text_field :main_contact_name, class: 'form-control'%>
<%= f.label :main_contact_phone %>
<%= f.text_field :main_contact_phone, class: 'form-control'%>
<%= f.label :main_contact_email %>
<%= f.text_field :main_contact_email, class: 'form-control'%>
<%= f.submit 'Save Project', class: 'btn btn-primary'%>
<% end %>
_show.html.erb
<div class='text-center center'>
<h3><strong>Project Information</strong></h2>
</div>
<h2>Start Date: Launch Date:</h1>
<span class='pull-right jumbo-btn-span'><%= link_to "Edit Project Information", switchProjectView_path(@project), remote: true, class:'btn btn-primary jumbo-btn' %></span>
<h2>Primary Conact's Name: <%= @project.main_contact_name %></h2>
<h2>Primary Conact's Phone: <%= @project.main_contact_phone %></h2>
<h2>Primary Conact's Email: <%= @project.main_contact_email %></h2>
那么,对于每个请求,您都需要在控制器方法中重新初始化变量。 对于您的情况,您需要执行以下操作:
def switch_main_view
@project = Project.new
respond_to do |format|
format.html
format.js
end
end
这样做将使您摆脱错误: 形式中的第一个参数不能包含nil或为null ,但是这将使您无法执行实际要执行的操作。
当您使用link_to
,默认情况下它会接受HTML请求(如在Rails日志中看到的那样),将出现类似以下内容:
Processing by ProjectsController#switch_main_view as HTML
为了获得JS响应,您需要告诉link_to
您准备使用JS响应,而不是HTML响应,并且可以通过在link_to
传递format: :js
来实现:
<%= link_to "Edit Project Information", switchProjectView_path(@project, format: :js), remote: true, class:'btn btn-primary jumbo-btn' %></span>
remote: true
会存在remote: true
以确保您没有重新加载页面的内容,而是尝试在后台从服务器中获取内容。
您的请求“ switchProjectView_path(@project)”仅将对象ID发送到服务器,因此您需要加载该对象以将其呈现在视图中以进行响应。
1.首先,路由应如下所示,以便url可以包含对象ID:
get 'switchProjectView/:id', to: 'projects#switch_main_view', as:"switchProjectView"
2.您必须将对象加载到控制器中: def switch_main_view @project = Project.find(params[:id]) respond_to do |format| format.html format.js end end
def switch_main_view @project = Project.find(params[:id]) respond_to do |format| format.html format.js end end
尝试在调用局部变量时传递变量:
$('#project-details').html("<%= j render :partial => 'projects/form', locals: {project: @project} %>");
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.