gpt4 book ai didi

javascript - 如何渲染包含 form_for 的编辑功能的部分?

转载 作者:行者123 更新时间:2023-11-28 18:05:58 25 4
gpt4 key购买 nike

我在父 View 中有一个 div,它呈现 show 部分。在这个 show 部分中,我有一个按钮应该更改父部分的部分以呈现“form”部分以编辑对象,但我一直被卡住,因为似乎“form”部分的 form_for 缺少 @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>

最佳答案

好吧,对于每个请求,您都需要在 Controller 方法中重新初始化变量。对于您的情况,您需要执行以下操作:

def switch_main_view
@project = Project.new
respond_to do |format|
format.html
format.js
end
end

这样做将使您摆脱错误:表单中的第一个参数不能包含 nil 或为空,但这不会使您能够执行您实际尝试执行的操作。

当您使用 link_to 时,默认情况下它会发出 HTML 请求,正如您在 Rails 日志中看到的那样,将会出现如下内容:

Processing by ProjectsController#switch_main_view as HTML

为了获得 JS 响应,您需要告诉 link_to 您正在接受 JS 响应,而不是 HTML 响应,您可以通过传递 format: 来做到这一点: link_to 中的 Node.js 如下:

<%= link_to "Edit Project Information", switchProjectView_path(@project, format: :js), remote: true, class:'btn btn-primary jumbo-btn' %></span>

remote: true 将确保您不会重新加载页面内容,而是尝试在后台从服务器获取某些内容。

关于javascript - 如何渲染包含 form_for 的编辑功能的部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42591137/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com