Cela fonctionne, mais je veux assécher le code de mon formulaire.
/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
J'ai essayé de modifier les vues "edit" et "new" pour passer l'URL.
nouveau.html.erb :
<%= render partial: "form", locals: {job: @job, url: user_jobs_path(current_user.id)} %>
edit.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 %>
Mais cela provoque une erreur de syntaxe :
Encountered a syntax error while rendering template: check <%= form_for(job) url: url do |form| %>
Dans _form.html.erb, si j'inclus simplement le formulaire en utilisant <%= render 'form' %>
avec :
<%= form_with scope: :job, url: user_job_path(current_user.id), method: "patch", local: true do |form| %>
...
L'édition fonctionne, mais la nouvelle donne lieu à cette erreur :
No route matches {:action=>"show", :controller=>"jobs", :user_id=>1}, missing required keys: [:id]
Quand j'essaie <%= form_for(@user_job) do |form| %>
J'ai compris :
"First argument in form cannot contain nil or be empty"
pour les nouveaux.
Quand j'essaie <%= form_with model: @user_job, local: true do |form| %>
J'ai compris :
No route matches [POST] "/users/1/jobs/new"
ce qui semble faux car rails routes
montre :
new_user_job GET /users/:user_id/jobs/new(.:format) jobs#new
etc. J'ai fait des recherches et la plupart des conseils donnés il y a plusieurs années consistent à passer une URL. J'ai lu la documentation Rails sur les formulaires, les partiels et le tutoriel du blog. Je pense que je fais une erreur très simple.
<%= form_with scope: :job, url: user_job_path(current_user.id), method: "patch", local: true do |form| %>