Rails表单传递不正确的ID

时间:2017-01-25 07:17:39

标签: ruby-on-rails

在我的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

1 个答案:

答案 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方法(不是强制性的,但是一种好的做法)。