我有一个Rails 4应用程序,可以通过两种方式创建用户帐户:新用户(注册)或管理员用户(添加帐户)。
我的思维过程是将所有请求发送到用户控制器中的新操作,在那里有一些逻辑来查看它是新用户还是管理员用户并相应地处理请求。这是我的模板:
new_by_admin.html.erb:
<%= form_for(@user) do |f| %>
<div class="col-md-6 col-md-offset-3">
<h1 class="centertext">Add User</h1>
<%= render 'add_user_fields', f: f %>
<%= f.submit "Create account", class: "btn btn-large btn-primary" %>
</div>
<% end %>
在控制器中,这很好用:
user_controller.rb:
def new
@user = User.new
if !signed_in?
@user.confirmation_code = User.new_confirmation_code
elsif signed_in? && current_user.admin?
new_by_admin
else
redirect_to root_url
end
end
def new_by_admin
@user = User.new
end
但是,下面的代码会在模板中抛出“表单中的第一个参数不能包含nil或为空”错误,大概是因为@user是nil。
def new
@user = User.new
if !signed_in?
@user.confirmation_code = User.new_confirmation_code
elsif signed_in? && current_user.admin?
render 'new_by_admin', user: @user
else
redirect_to root_url
end
end
这些之间有什么区别,为什么即使我将@user对象作为参数传递给部分,第二种方法也不起作用?
答案 0 :(得分:1)
render
允许您指示控制器操作呈现与默认值不同的视图,该视图与操作名称(在您的情况下为new
)匹配。呈现指定视图时,它可以访问操作设置的任何实例变量。没有必要作为一个参数传递任何东西(我甚至不确定是否可能)。
相反,只需使用:render :new_by_admin
答案 1 :(得分:0)
我明白了。在查看服务器上的终端时,我注意到请求被发送给用户#new_by_admin。所以这是routes.rb文件中的一个问题。我有这样定义的路线(来自之前的尝试):
get '/adduser', to: 'users#new_by_admin', as: 'add_user'
将此更改为:
get '/adduser', to: 'users#new, as: 'add_user'
让它发挥作用。我不完全理解为什么,因为用户对象也是在new_by_admin方法中启动的,但它现在可以正常工作。我还根据利益相关者的建议将OP中的渲染线更改为:
render :new_by_admin