28

我有一个表单,根据调用它的参数而有所不同。

前任。

testsite.local/users/new?type=client

因此,如果typeab,表单将显示不同的字段。

我的问题是表单填写不正确,因为如果无法正确保存用户,它会使用默认错误消息呈现表单,但也没有我的参数。

testsite.local/users/new

如何调用我的render操作并将此参数设置为传递给它?这样我仍然可以保留我的内置错误消息,说明为什么无法正确提交表格并且表格是否正确?

这是我的create行动:

def create
   @user = User.new(params[:user])
   roles = params[:user][:assigned_roles]
   if @user.save
     update_user_roles(@user,roles)
     if current_user.is_admin_or_root?
       flash[:message] = "User \"#{@user.username}\" created."
       redirect_to users_path
     else
       flash[:message] = "Congrats! You're now registered!"
       redirect_to app_path
     end
   else
     render :action => 'new'
   end
 end
4

4 回答 4

19

正如另一位用户回答我的其他相关问题所阐明的那样,这就是我所追求的:

form_for @user, :url => { :action => :create, :type => @type }

...它通过每个新的渲染操作保留参数:type(假设我在控制器中正确定义了它)。

于 2009-10-12T14:34:35.877 回答
14

有两种方法可以做到这一点。

向 form_for 添加隐藏字段或额外参数

在包含命名类型的表单中添加隐藏字段并将其设置为 params[:type] 如果验证失败,这将保留渲染上的类型。

查看代码:

<% form_for @user do |f| %>
...
<%= hidden_field_tag :type, params[:type] %>
<%end%>

在表单中添加一个额外的参数:

<% form_for @user, create_user_path(@user, :type => params[:type]) %>
...
<%end%>

任何一个都会做你想做的事。

于 2009-10-11T04:06:33.343 回答
6

Rails 指南摘录

将 render 与 :action 一起使用是 Rails 新手经常感到困惑的原因。指定的操作用于确定要呈现哪个视图,但 Rails 不会在控制器中运行该操作的任何代码

我相信您new?type=client习惯于在新操作中设置某种变量?并且该变量稍后会在您的 new.html.erb 视图中使用?

然后你需要像这样改变你的创建动作:

  else
     # add code here to setup any variable for type = client
     # and which will be used in your view
     render :action => 'new'
  end
 end
于 2009-10-10T21:24:29.487 回答
3

你总是可以通过以下方式强制它:

params[:type] ||= "client"

在您的控制器中的新操作中。如果未设置类型,则默认为客户端。但是,该 URL 不会显示此内容。

于 2009-10-10T22:06:15.987 回答