这样-6ren">
gpt4 book ai didi

ruby-on-rails - Rails 表单在验证错误后呈现错误的 URL(不保留传递的参数)

转载 作者:行者123 更新时间:2023-12-04 06:00:32 25 4
gpt4 key购买 nike

在项目展示页面上,我在我的“创建新任务”上传递了一个非常简单的参数,该参数存储来自哪个项目:

@project.id), :class => "btn btn-info col-md-12"%>

这样当我为它创建一个新任务时,它会将它存储在我的新任务表单上的 URL 中,如下所示:

http://localhost:3000/task/new?project_id=5

我的新表格如下:
<div class="container sign-in-register">
<div class="authform">

<%= form_for @task, :html => {:multipart => true} do |f| %>

<h3>Add a task for this project...</h3><br/>

<%= f.label :name %>
<%= f.text_field :name, class: 'form-control' %>

<%= hidden_field_tag 'project_id', @project_id %>

<%= f.fields_for :taskrelationships do |ff| %>
<%= ff.hidden_field :taskproject_id, value: @project_id %>
<%= ff.label :task_url %>
<%= ff.text_field :task_url, class: 'form-control' %>
<% end %>

<br clear="all">

<%= f.submit "Save Task", class: "btn btn btn-info" %>
<% end %>

</div>
</div>

正如您所看到的,我在表单中使用了嵌套属性(我正在创建一个任务和一个 TaskRelationship。现在,当我尝试保存而不填写所有必填字段时,会抛出一个验证,但由于某种原因,它将我重定向到:
http://localhost:3000/tasks

而不是原来的:
http://localhost:3000/tasks/new?project_id=5

我已经阅读了很多帖子,但似乎没有一个能回答这个特殊情况。下面的 stackO 帖子已经关闭,但是当我尝试使用任务而不是用户时,它仍然找不到 task_ID

Render error on new page with customize url like http://localhost:3000/education_informations/new?user_id=10

我怎样才能让 rails 简单地呈现与我开始时完全相同的 url - 看起来这应该很容易,所以必须缺少一些小东西。

我的 Controller 操作:
def new
@project_id = params[:project_id]
@task = Task.new
@task.taskrelationships.build
end

def create
@project = Project.find(params[:project_id])

@task = Task.new(task_params)
if @task.save
flash[:success] = "This task has been added."
@task.taskrelationships.create!(@taskrelationships_params)
redirect_to tasks_project_path(@project)
else
@task.taskrelationships.build(@taskrelationships_params)
flash[:alert] = @task.errors.full_messages.to_sentence
render :new
end
end

private

def task_params
@taskrelationships_params = params.require(:task).permit(taskrelationships_attributes: [
:task_url,
:taskproject_id
])[:taskrelationships_attributes]["0"]

params[:task].delete(:taskrelationships_attributes)
params.require(:task).permit(
:name,
:user_id,
taskrelationships_attributes: [
:task_url,
:taskproject_id
]
).merge(owner: current_user)
end

更新/路线
resources :projects do
resources :reviews, except: [:destroy]
member do
get :tasks
end
end

resources :tasks
resources :taskrelationships, only: [:create, :destroy] do
post :vote, on: :member, controller: "task_relationships"
end

感谢您的任何帮助...

最佳答案

好的,首先解释一下这里发生了什么:

当您调用 http://localhost:3000/task/new?project_id=5您实际上被路由到任务 Controller 上的新操作(使用 project_id 参数)。

然后您的新操作设置变量,rails 将呈现包含您的新任务表单的 new.html.erb。

当您提交表单时,它实际上是对/tasks 执行 http POST,它路由到您的任务 Controller 的创建操作。该 url 和 http 方法是从 form_for 助手生成的结果:

<%= form_for @task, :html => {:multipart => true} do |f| %>

这就是url从 /tasks/new?project_id=5改变的原因至 /tasks
现在,如果验证失败,创建操作只会呈现新表单 - 它不会重定向到任何地方 - url 与输入此操作时的内容保持不变 - 意思是,它仍然为 /tasks .

您实际上不需要导航到/tasks/new?project_id=5 来呈现新表单,但您需要做的是在 Controller 中设置 @project_id 以便 View 可以访问该变量(就像它在新 Action ):
  def create
@project = Project.find(params[:project_id])

@task = Task.new(task_params)
if @task.save
flash[:success] = "This task has been added."
@task.taskrelationships.create!(@taskrelationships_params)
redirect_to tasks_project_path(@project)
else
@task.taskrelationships.build(@taskrelationships_params)
@project_id = @project.id
flash[:alert] = @task.errors.full_messages.to_sentence
render :new
end
end

因此,要澄清 url 中的更改不是重定向,它只是表单发布到与/tasks/new 不同的 url,这实际上只是一个表面问题。

现在,如果您担心,您可以将路由更改为如下所示:
  resources :tasks, except: [:create, :new]

post 'new_task' => 'tasks#create'
get 'new_task' => 'tasks#new'

这将 POST 和 GET http 方法映射到/new_task,因此对于 new 和 create 操作调用,url 看起来相同。请注意,您确实需要更改 form_for 助手中的 url 才能使用此新路由:
<%= form_for @task, url: 'new_task', multipart: true do |f| %>

关于ruby-on-rails - Rails 表单在验证错误后呈现错误的 URL(不保留传递的参数),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40333368/

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