Rails:使用render:action传递参数?

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

防爆。

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 

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

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

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

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

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

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

查看代码:

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

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

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

任何一个人都会做你想要的。

Rails指南提取

使用render with: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 

你可以随时强迫它:

 params[:type] ||= "client" 

在您的控制器中的新操作中。 如果未设置type,则默认为client。 但是,URL不会显示此信息。