在我的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
的routes.rb
devise_for :users, :controllers => { :registrations => "registrations", :omniauth_callbacks => "users/omniauth_callbacks" }
resources :users do
collection do
get 'info'
post 'submit_info'
end
end
答案 0 :(得分:0)
当您需要更新特定用户并且您已在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
方法(不是强制性的,但是一种好的做法)。