0

我有一个用于创建票证的表格,它需要一个项目的 ID。这有效,但在验证方面无效。如果验证未通过,则执行“render :new”并且 project_id 不附带。

我试过'redirect_to new_ticket_path(:project_id => params[:ticket][:project_id]) 再次呈现表单,但错误消息不会显示,所以我似乎需要使用'render :new'。

如何将 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
4

4 回答 4

1

这将只呈现“新”视图,但不会运行控制器操作。您需要在“创建”操作中为“新”视图设置变量。

来自http://guides.rubyonrails.org/layouts_and_rendering.html#using-render

将 render 与 :action 一起使用是 Rails 新手经常感到困惑的原因。指定的操作用于确定要呈现哪个视图,但 Rails 不会在控制器中运行该操作的任何代码。您在视图中需要的任何实例变量都必须在调用渲染之前在当前操作中设置。

解决此问题的最简单方法是更改​​“新”:

def new
  @ticket = Ticket.new(:project_id => params[:project_id])
end

并将“新”表单中对@project 的任何引用更改为@ticket.project。此时,只要您的表单包含工单项目 ID 的隐藏字段,您就不必在“创建”操作中添加任何内容。

于 2013-02-14T14:59:18.250 回答
1

让这个工作(我无论如何都会这样做)的最简单方法是将任务资源嵌套在项目下。这样,您将始终在 params 中有 project_id 可用。

# config/routes.rb
resources :projects do
  resources :tasks
end

网址看起来像projects/123/tasks/new等。看看rake routes

于 2013-02-14T15:02:28.807 回答
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 %>
于 2013-02-14T14:58:19.187 回答
-1

你为什么不使用:

 flash[:alert] = @ticket.errors.inspect
 redirect_to new_ticket_path(:project_id => params[:ticket][:project_id])
于 2013-02-14T14:58:34.450 回答