轨道表单传递不正确的 ID



在我的 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路由将确保路由中的用户正确idcollection路由用于收集对象,例如列出所有用户的用户索引页。

由于您面临user_params问题,因此对于强参数,您需要在控制器中定义方法:

def user_params
  # permitted attributes
end

这应该定义为控制器中的private方法(不是强制性的,但是一种很好的做法)。

最新更新