0

我正在使用设计并创建了一个模型配置文件。

我已将 has_one 关系添加到 user 和 belongs_to :user 到配置文件模型。我还在配置文件中添加了 user_id 列。

我还添加了

before_filter :create_profile
def create_profile 
  profile = Profile.create
end

在用户模型中。当新用户注册时,会创建一个新的配置文件。因此,如果用户 ID 为 10,这就是在配置文件中创建的内容

#<Profile id: 2, name: nil, created_at: "2013-08-17 06:44:33", updated_at: "2013-08-17 06:47:00", user_id: 10> 

现在的问题是,我在 application.rb 中放置了一个编辑链接

<li><%= link_to "Profile".html_safe, edit_profile_path(current_user) %></li>

但它给出了错误

Couldn't find Profile with id=10

所以不是搜索 id=2,而是查看 user_id,如何解决这个问题?我确信我错过了一些非常小的东西,但不确定是什么。

编辑 - 错误来自编辑方法中的这一行 @profile = Profile.find(params[:id])

# profiles_controller.rb
def edit
  @profile = Profile.find(params[:id])
end

我曾尝试使用 :user_id 和 :profile_id 但这也给出了错误“找不到没有 ID 的配置文件”

编辑2-

routes.rb 有,它几乎是空白的

resources :profiles

rake 路由输出(其他路径是设计标准路径)

                profiles GET        /profiles(.:format)                                     profiles#index
                         POST       /profiles(.:format)                                     profiles#create
             new_profile GET        /profiles/new(.:format)                                 profiles#new
            edit_profile GET        /profiles/:id/edit(.:format)                            profiles#edit
                 profile GET        /profiles/:id(.:format)                                 profiles#show
                         PUT        /profiles/:id(.:format)                                 profiles#update
                         DELETE     /profiles/:id(.:format)                                 profiles#destroy

profile_controller.rb ,其他5个方法是标准的一次

  def edit
    @user = current_user
    @profile = @user.profiles.find(params[:profile_id])

  end

  def create

    @profile = current_user.build_profile(params[:profile])

    respond_to do |format|
      if @profile.save
        format.html { redirect_to @profile, notice: 'User profile was successfully created.' }
        format.json { render json: @profile, status: :created, location: @profile }
      else
        format.html { render action: "new" }
        format.json { render json: @profile.errors, status: :unprocessable_entity }
      end
    end
  end
4

3 回答 3

2

首先修复您的用户模型:

before_filter :create_profile
def create_profile 
  profile = Profile.create
end

应该:

after_create :create_profile

def create_profile
  self.profile.create
end

before_filter 适用于控制器,不适用于模型!

第二:改变这一行

<li><%= link_to "Profile".html_safe, edit_profile_path(current_user) %></li>

对此:

<li><%= link_to "Profile", edit_profile_path(current_user.profile) %></li>

第三:更改您的控制器编辑操作:

def edit
  @profile = current_user.profile
end

我认为您可以从您的profiles_controller 中删除create 操作,因为您的用户模型中有创建配置文件的before_create 钩子。

您的路线

resources :profiles

只是为您提供编辑操作的 id 参数,这是来自配置文件的 id,而不是来自用户的 id。您可以通过嵌套路由为 current_user 添加一个,但这不是必需的,因为您已经拥有来自 devise 的 current_user 方法,该方法返回当前登录用户。

顺便提一句:

"Profile".html_safe 

=> 不是必需的。

"<h1>Profile</h1>".html_safe

=> 将是必要的。

于 2013-08-17T15:08:18.547 回答
2

如果设计已经提供了编辑功能,那么为什么你需要维护配置文件只是为了编辑,如果你需要它,你不应该在配置文件中添加 user_id 列,它应该是用户。

尝试这个:

<%= link_to "edit", edit_user_registration_path(current_user) %>
于 2013-08-17T07:47:30.693 回答
1

不确定您的控制器是什么样子,但您可以明确告诉 rails 在哪里可以找到 profile_id。像这样的东西:

<li><%= link_to "Profile".html_safe, edit_profile_path(current_user, profile_id: @profile) %></li>

编辑
#<Class:0xb459b8c>是整个用户类,而不是一个实例,这就是你不能调用profiles它的原因。尝试这个:

@user = current_user
@profile = @user.profiles.find(params[:profile_id])

编辑 2

根据你原来的问题:

问题是,我在 application.rb 中放置了一个编辑链接

<li><%= link_to "Profile".html_safe, edit_profile_path(current_user) %></li>

但它给出了错误

Couldn't find Profile with id=10

所以不是搜索 id=2,而是查看 user_id,如何解决这个问题?

我认为问题出在这里:

`<li><%= link_to "Profile".html_safe, edit_profile_path(current_user) %></li>`

你的 `edit_profile_path' 要求

/profiles/:id/edit(.:format)

:idprofile表的 :id ,而不是user表 - 所以你link_to应该看起来像这样:

<li><%= link_to "Profile".html_safe, edit_profile_path(id: @profile.id) %></li>

要不就

<li><%= link_to "Profile".html_safe, edit_profile_path(@profile) %></li>

你的控制器应该是这样的(它最初是怎么做的):

# profiles_controller.rb
def edit
  @profile = Profile.find(params[:id])
end

这将为您的路线提供他们想要的。

于 2013-08-17T07:41:52.457 回答