发送参数以进行渲染

时间:2013-02-14 14:51:20

标签: ruby-on-rails ruby-on-rails-3 forms validation error-handling

我有一个用于创建故障单的表单,该表单需要项目的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

4 个答案:

答案 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])