如何 DRY Rails 6 部分表格
How to DRY a Rails 6 partial form
这行得通,但我想擦干我的表单代码。
/app/views/jobs/edit.html.erb:
<h1>Edit Job</h1>
<%= form_with model: @job, url: user_job_path(current_user.id), method: "patch", local: true do |form| %>
<!-- contents of form -->
<% end %>
/app/views/jobs/new.html.erb:
<h1>Add Job</h1>
<%= form_with scope: :job, url: user_jobs_path(current_user.id), local: true do |form| %>
<!-- contents of form -->
<% end %>
/app/controllers/jobs_controller.rb:
class JobsController < ApplicationController
def new
@job = Job.new
end
def edit
@job = Job.find(params[:id])
end
def create
@job = Job.new(job_params)
@job.user_id = current_user.id
if @job.save
redirect_to user_jobs_path(current_user.id)
else
render 'new'
end
end
def update
@job = Job.find(params[:id])
@job.user_id = current_user.id
if @job.update(job_params)
redirect_to user_jobs_path(current_user.id)
else
render 'edit'
end
end
...
end
/config/routes.rb:
Rails.application.routes.draw do
resources :users do
resources :jobs
end
...
end
我尝试更改编辑和新视图以通过 URL。
新.html.erb:
<%= render partial: "form", locals: {job: @job, url: user_jobs_path(current_user.id)} %>
编辑。html.erb:
<%= render partial: "form", locals: {job: @job, url: user_jobs_path(current_user.id, job.id)} %>
_form.html.erb:
<%= form_for(job) url: url do |form| %>
<!-- contents of form -->
<% end %>
但是会导致语法错误:
Encountered a syntax error while rendering template: check <%= form_for(job) url: url do |form| %>
在 _form.html.erb 中,如果我简单地包含使用 <%= render 'form' %>
的表单:
<%= form_with scope: :job, url: user_job_path(current_user.id), method: "patch", local: true do |form| %>
...
编辑有效,但出现此错误的新结果:
No route matches {:action=>"show", :controller=>"jobs", :user_id=>1}, missing required keys: [:id]
当我尝试 <%= form_for(@user_job) do |form| %>
时,我得到:
"First argument in form cannot contain nil or be empty"
新的。
当我尝试 <%= form_with model: @user_job, local: true do |form| %>
时,我得到:
No route matches [POST] "/users/1/jobs/new"
这似乎是错误的,因为 rails routes
显示:
new_user_job GET /users/:user_id/jobs/new(.:format) jobs#new
等我搜索了一下,几年前的大部分建议都是通过 URL。我阅读了 Rails 有关表单、部分和博客教程的文档。我怀疑我犯了一个非常简单的错误。
<%= form_with scope: :job, url: user_job_path(current_user.id), method: "patch", local: true do |form| %>
更新:我没注意到路线。
您可以像这样创建一个 _form.html.erb
部分:
对于嵌套路由,您还需要传递 user
对象。
<%= form_with(model: [user, job]) do |form| %>
<!-- contents of your form -->
<% end %>
并更改您的 new.html.erb
和 edit.html.erb
文件,例如:
<%= render 'form', job: @job, user: current_user %>
current_user
因为你正在使用 devise
要创建路由到嵌套路由的表单,您需要传递一个数组:
# app/views/jobs/_form.html.erb
<%= form_with(model: [user, job]) %>
# ...
<% end %>
# app/views/jobs/new.html.erb
<%= render 'form' user: current_user, job: @job %>
# app/views/jobs/edit.html.erb
<%= render 'form' user: current_user, job: @job %>
但是您为什么首先嵌套路由有点值得怀疑,因为您根本没有将它用作嵌套资源。 GET /users/:user_id/jobs
应该只显示属于该用户的工作,POST /users/:user_id/jobs
应该创建属于该用户而不是当前用户的工作。
这行得通,但我想擦干我的表单代码。
/app/views/jobs/edit.html.erb:
<h1>Edit Job</h1>
<%= form_with model: @job, url: user_job_path(current_user.id), method: "patch", local: true do |form| %>
<!-- contents of form -->
<% end %>
/app/views/jobs/new.html.erb:
<h1>Add Job</h1>
<%= form_with scope: :job, url: user_jobs_path(current_user.id), local: true do |form| %>
<!-- contents of form -->
<% end %>
/app/controllers/jobs_controller.rb:
class JobsController < ApplicationController
def new
@job = Job.new
end
def edit
@job = Job.find(params[:id])
end
def create
@job = Job.new(job_params)
@job.user_id = current_user.id
if @job.save
redirect_to user_jobs_path(current_user.id)
else
render 'new'
end
end
def update
@job = Job.find(params[:id])
@job.user_id = current_user.id
if @job.update(job_params)
redirect_to user_jobs_path(current_user.id)
else
render 'edit'
end
end
...
end
/config/routes.rb:
Rails.application.routes.draw do
resources :users do
resources :jobs
end
...
end
我尝试更改编辑和新视图以通过 URL。
新.html.erb:
<%= render partial: "form", locals: {job: @job, url: user_jobs_path(current_user.id)} %>
编辑。html.erb:
<%= render partial: "form", locals: {job: @job, url: user_jobs_path(current_user.id, job.id)} %>
_form.html.erb:
<%= form_for(job) url: url do |form| %>
<!-- contents of form -->
<% end %>
但是会导致语法错误:
Encountered a syntax error while rendering template: check <%= form_for(job) url: url do |form| %>
在 _form.html.erb 中,如果我简单地包含使用 <%= render 'form' %>
的表单:
<%= form_with scope: :job, url: user_job_path(current_user.id), method: "patch", local: true do |form| %>
...
编辑有效,但出现此错误的新结果:
No route matches {:action=>"show", :controller=>"jobs", :user_id=>1}, missing required keys: [:id]
当我尝试 <%= form_for(@user_job) do |form| %>
时,我得到:
"First argument in form cannot contain nil or be empty"
新的。
当我尝试 <%= form_with model: @user_job, local: true do |form| %>
时,我得到:
No route matches [POST] "/users/1/jobs/new"
这似乎是错误的,因为 rails routes
显示:
new_user_job GET /users/:user_id/jobs/new(.:format) jobs#new
等我搜索了一下,几年前的大部分建议都是通过 URL。我阅读了 Rails 有关表单、部分和博客教程的文档。我怀疑我犯了一个非常简单的错误。
<%= form_with scope: :job, url: user_job_path(current_user.id), method: "patch", local: true do |form| %>
更新:我没注意到路线。
您可以像这样创建一个 _form.html.erb
部分:
对于嵌套路由,您还需要传递 user
对象。
<%= form_with(model: [user, job]) do |form| %>
<!-- contents of your form -->
<% end %>
并更改您的 new.html.erb
和 edit.html.erb
文件,例如:
<%= render 'form', job: @job, user: current_user %>
current_user
因为你正在使用 devise
要创建路由到嵌套路由的表单,您需要传递一个数组:
# app/views/jobs/_form.html.erb
<%= form_with(model: [user, job]) %>
# ...
<% end %>
# app/views/jobs/new.html.erb
<%= render 'form' user: current_user, job: @job %>
# app/views/jobs/edit.html.erb
<%= render 'form' user: current_user, job: @job %>
但是您为什么首先嵌套路由有点值得怀疑,因为您根本没有将它用作嵌套资源。 GET /users/:user_id/jobs
应该只显示属于该用户的工作,POST /users/:user_id/jobs
应该创建属于该用户而不是当前用户的工作。