Rails:使用渲染传递参数:action?
Posted
技术标签:
【中文标题】Rails:使用渲染传递参数:action?【英文标题】:Rails: Pass parameters with render :action? 【发布时间】:2010-12-05 15:56:28 【问题描述】:我有一个表单,根据调用它的参数不同,它的显示方式也不同。
例如
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
【问题讨论】:
【参考方案1】:Rails 指南摘录
将渲染与 :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
【讨论】:
嗯,这仍然破坏了我的 URL 路径的视觉一致性,因此,在提交表单失败时,URL 会从new?type=client
更改为 new
。有没有办法为新渲染的动作设置 url 参数?还是我在这里仍然遗漏了什么?
哇,这让我非常沮丧。为什么它不只是重新加载新动作?我不得不复制/粘贴不是最佳的代码。【参考方案2】:
你总是可以通过以下方式强制它:
params[:type] ||= "client"
在您的控制器中的新操作中。如果未设置类型,则默认为客户端。但是,该 URL 不会显示此内容。
【讨论】:
【参考方案3】:有两种方法可以做到这一点。
在 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%>
任何一个都会做你想做的事。
【讨论】:
你如何区分更新和创建的形式?【参考方案4】:正如另一个用户回答我的另一个 related question 所阐明的那样,这就是我所追求的:
form_for @user, :url => :action => :create, :type => @type
...通过每个新的渲染操作保留参数:type
(假设我在控制器中正确定义了它)。
【讨论】:
如果你想为create
和update
操作定义相同的东西,你会怎么做?以上是关于Rails:使用渲染传递参数:action?的主要内容,如果未能解决你的问题,请参考以下文章