我有一个用于创建故障单的表单,该表单需要项目的ID。这有效,但在验证时无效。如果验证不通过'render:new',则project_id不会随附。
我试过'redirect_to new_ticket_path(:project_id => params [:ticket] [:project_id])再次渲染表单,但错误消息不会显示,所以似乎我需要使用'render :新的”
如何将project_id传递回表单或从表单中传递project_id而不传递它?
def new
@ticket = Ticket.new
@id = params[:project_id]
@project = Project.find(@id)
end
def create
@ticket = Ticket.new(params[:ticket].merge(:user_id => current_user.id))
if @ticket.save
redirect_to @ticket
else
render :new <--- will render without the project_id
end
end
答案 0 :(得分:1)
这将只呈现'new'的视图,但不会运行控制器操作。您需要在“创建”操作中为“新”视图设置变量。
来自http://guides.rubyonrails.org/layouts_and_rendering.html#using-render
使用render with:action是Rails的常见混淆源 新人。指定的操作用于确定要查看的视图 渲染,但Rails不会运行该动作的任何代码 控制器。必须在视图中需要的任何实例变量 在调用render之前在当前操作中设置。
最简单的方法是改变'新':
def new
@ticket = Ticket.new(:project_id => params[:project_id])
end
并将“new”表单中对@project的任何引用更改为@ ticket.project。此时,只要表单包含故障单项目ID的隐藏字段,就不必向“创建”操作添加任何内容。
答案 1 :(得分:1)
使这项工作最简单的方法(无论如何我会这样做)是将任务资源嵌套在项目下。这样你就可以在params中使用project_id了。
# config/routes.rb
resources :projects do
resources :tasks
end
网址将显示为projects/123/tasks/new
等。请查看rake routes
。
答案 2 :(得分:0)
将项目ID写入表单中的隐藏字段,您就可以了。并且不要忘记在您的创建操作中初始化@id
def new
@ticket = Ticket.new
@id = params[:project_id]
@project = Project.find(@id)
end
def create
@ticket = Ticket.new(params[:ticket].merge(:user_id => current_user.id))
@id = params[:project_id] # but make sure it is under this key in params
if @ticket.save
redirect_to @ticket
else
render :new <--- will render without the project_id
end
end
并以表格添加
<%= hidden_field :project_id, '', value: @id %>
答案 3 :(得分:-1)
你为什么不用:
flash[:alert] = @ticket.errors.inspect
redirect_to new_ticket_path(:project_id => params[:ticket][:project_id])