背景:我有两个模型User
(设计模型(和Client
。 我设置了关联,以便Client belongs_to :user
和User has_one :client
. 我已经设置了我的数据库,使客户表具有user_id
属性
问题:在我的导航栏中,一旦用户登录,我希望他们能够访问由Client
模型表示的"配置文件",但是我似乎无法通过user_params
访问正确的客户端。 例如<%= link_to "My Profile", client_path(@user) %>
这会导致错误No route matches {:action=>"show", :controller=>"clients", :id=>nil} missing required keys: [:id]
即使 :id 应该可用,因为用户已登录。
我已经编辑了设计sessions_controller
以包含:
def configure_sign_in_params
devise_parameter_sanitizer.permit(:sign_up) do |user_params|
user_params.permit( :email, :password, :id)
end
end
。但仍然没有运气。 我有一种感觉,我错过了一些基本的东西,我只是需要一些帮助。
我缺少一些基本的东西
你不需要@user
,它需要current_user
:
<%= link_to "Profile", client_path(current_user) if user_signed_in? %>
我们使用类似的模式(User has_one Profile
(;我们做了一个singular resource
,它否定了传递对象的需要:
#app/models/user.rb
class User < ActiveRecord::Base
has_one :client
accepts_nested_attributes_for :client
end
#config/routes.rb
resource :profile, only: [:show, :update] #-> url.com/profile
#app/controllers/profile_controller.rb
class ProfileController < ApplicationController
def update
current_user.update user_params
end
private
def user_params
params.require(:user).permit(client_attributes: [:x, :y, :z])
end
end
#app/views/profile/show.html.erb
<%= form_for current_user do |f| %>
<%= f.fields_for :client do |c| %>
<%= c.text_field :x %>
<% end %>
<%= f.submit %>
<% end %>
这将允许您将请求发送到... <%= link_to "Profile", profile_path %>
.
由于您只允许每个用户的profile
视图,因此您将能够为其调用current_user
对象。