在我的 Rails 5 应用程序中,我正在尝试创建一个表单,使用我创建的新操作更新我的用户模型。
但是,我遇到了 404 错误(但由于当前值显示在表单中,因此记录就在那里)。 我认为这是因为 User.id 在表格中没有正确传递,但我不确定。
错误: ActiveRecord::RecordNotFound (ActiveRecord::RecordNotFound)
Started PATCH "/users/submit_info" for ::1 at 2017-01-24 23:02:31 -0800
Processing by UsersController#update as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"[FILTERED]", "user"=>{"name"=>"Foo"}, "commit"=>"Submit Details", "id"=>"submit_info"}
User Load (0.0ms) SELECT `users`.* FROM `users` WHERE `users`.`slug` = 'submit_info' ORDER BY `users`.`id` ASC LIMIT 1
Completed 404 Not Found in 3ms (ActiveRecord: 0.0ms)
视图
<%= simple_form_for @user, url: submit_info_users_path do |f| %>
<%= f.input :name %>
<%= f.button :submit %>
控制器
def submit_info
@user = User.friendly.find(current_user.id)
respond_to do |format|
if @user.save(user_params)
format.html { redirect_to @user, notice: 'User was successfully updated.' }
format.json { render :show, status: :ok, location: @user }
else
format.html { render :info }
format.json { render json: @user.errors, status: :unprocessable_entity }
end
end
end
# I'm using the Friendly_ID gem
def set_user
@user = User.friendly.find(params[:id])
end
路线.rb
devise_for :users, :controllers => { :registrations => "registrations", :omniauth_callbacks => "users/omniauth_callbacks" }
resources :users do
collection do
get 'info'
post 'submit_info'
end
end
因为您需要更新特定用户,并且您已经在collection
路由中提到了该操作。相反,它应该在member
路由中:
resources :users do
collection do
get 'info'
end
member do
post 'submit_info'
end
end
因此,当您传入路径时,此member
路由将确保路由中的用户正确id
。collection
路由用于收集对象,例如列出所有用户的用户索引页。
由于您面临user_params
问题,因此对于强参数,您需要在控制器中定义方法:
def user_params
# permitted attributes
end
这应该定义为控制器中的private
方法(不是强制性的,但是一种很好的做法)。