[英]Rails: Pass parameters with render :action?
我有一个表单,根据调用它的参数显示不同。
防爆。
testsite.local/users/new?type=client
因此,如果type
是a
或b
,则表单将显示不同的字段。
我的问题是表单填写不正确,因为如果用户无法正确保存,它会使用默认错误消息呈现表单,但也没有我的参数。
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],如果验证失败,这将保留渲染上的类型。
查看代码:
<% 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不会显示此信息。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.