我在我的应用程序中为用户使用Gem Devise。我在用户中添加了设置为nil的role属性。登录后,在应用程序控制器中,我有一个重定向,转到用户控制器中的自定义操作,如果current_user.role = nil
,则视图称为binary_selection。代码在
application_controller.rb:
def after_sign_in_path_for(resource)
if current_user.role.nil? ## temporary solution
#update_path(resource)
binary_selection_path(resource)
else
root_path(resource)
end
end
users_controller.rb:
def binary_selection
@user = current_user
respond_to do |format|
if @user.update_attributes(params[:user][:role])
format.html { redirect_to root_url, notice: "#{@user.name} was updated." }
else
format.html { render action: "edit" }
end
end
end
视图/用户/ binary_selection.html.erb:
<%= form_for @user, url: binary_selection_path(@user), html: { method: :patch } do |f|
%><%= current_user %>
<div class = "form-group">
<%= f.label :role %>
<%= f.text_field :role, class: 'form-control', placeholder: "Enter wiki title", id: 'wiki_title' %>
</div>
<div class = "form-group">
<%= f.submit class: 'btn btn-success' ,id: 'wiki_submit' %>
</div>
<% end %>
配置/ routes.rb中:
Rails.application.routes.draw do
devise_for :users
get "/users" => "users#binary_selection", as: 'binary_selection'
resources :users
end
当我被重定向到binary_selection视图时,我收到此错误:
NoMethodError in UsersController#binary_selection
undefined method `[]' for nil:NilClass
在用户控制器中突出显示此行: if @ user.update_attributes(params [:user] [:role])
我也注意到错误页面上的params有这个:
{"format"=>"13"}
答案 0 :(得分:0)
record#update_attributes不接受单个值,它接受散列。所以正确的代码应该是这样的:
if @ user.update_attributes(params [:user])
轨道4中的if @ user.update_attributes(user_params)
确保您已允许用户参数。
答案 1 :(得分:0)
您在sign_in之后将用户重定向到binaray_selection_path
。这将导致HTTP GET请求。在users_controller
中,您尝试从params
获取一个简单不存在的属性。没有params[:user]
,因为表单尚未发送。
如果表单已呈现,您需要将用户重定向到页面。
我建议您阅读本指南:http://guides.rubyonrails.org/getting_started.html#getting-up-and-running