Ruby on rails RubyonRails:Can';t渲染嵌套模型的编辑视图

Ruby on rails RubyonRails:Can';t渲染嵌套模型的编辑视图,ruby-on-rails,devise,Ruby On Rails,Devise,我是rails的新手,遇到了一个我似乎无法理解的问题。我将解释我的情景: 我有一个使用Desive创建的用户模型。我创建了另一个名为Skill(math:integer-science:integer)的模型,它引用了用户: - skill belongs_to :user - user has_one :skill 我已修改路由文件,以便skill在用户中具有嵌套路由: # Users (Devise) devise_for :users, :path_names => { :sig

我是rails的新手,遇到了一个我似乎无法理解的问题。我将解释我的情景:

我有一个使用Desive创建的用户模型。我创建了另一个名为Skill(math:integer-science:integer)的模型,它引用了用户:

- skill belongs_to :user 
- user has_one :skill
我已修改路由文件,以便skill在用户中具有嵌套路由:

# Users (Devise)
devise_for :users, :path_names => { :sign_up => "register"}

# Skills
resources :users do
  resource :skills
end
我已经创建了一个带有编辑和更新操作的SkillsController。代码如下:

class SkillsController < ApplicationController

  def edit
    @user = User.find(params[:user_id])
    @skill = get_skill(@user)
  end

  def update
    @skill = Skill.find(params[:id])

    if (@skill.update_attributes(params[:skill]))
      redirect_to(root_url, {:notice => 'Your skills were successfully updated.'})
    else
      render :action => "edit"
    end
  end

  # the user might have been created without skills, so it will be nil on the first usage
  # ToDo: extend Devise UserController to create an empty skill on the create action
  def get_skill(user)
    if !(user.skill)
      user.skill = Skill.new
      user.save
    end
    user.skill
  end
end
<%= form_for(@skill) do |skill_form| %>

    <div>
      <%= skill_form.label :math %><br />
      <%= skill_form.text_field :math %>
    </div>

    <div class="actions">
      <%= skill_form.submit 'Save' %>
    </div>

<% end %>
class SkillsController“您的技能已成功更新”。})
其他的
呈现:操作=>“编辑”
结束
结束
#用户可能是在没有技能的情况下创建的,因此在第一次使用时它将为零
#ToDo:扩展Desive UserController以在创建操作上创建空技能
def获取技能(用户)
如果!(用户技能)
user.skill=skill.new
user.save
结束
用户技能
结束
结束
最后,我的视图/skills/edit.html.erb视图如下所示:

class SkillsController < ApplicationController

  def edit
    @user = User.find(params[:user_id])
    @skill = get_skill(@user)
  end

  def update
    @skill = Skill.find(params[:id])

    if (@skill.update_attributes(params[:skill]))
      redirect_to(root_url, {:notice => 'Your skills were successfully updated.'})
    else
      render :action => "edit"
    end
  end

  # the user might have been created without skills, so it will be nil on the first usage
  # ToDo: extend Devise UserController to create an empty skill on the create action
  def get_skill(user)
    if !(user.skill)
      user.skill = Skill.new
      user.save
    end
    user.skill
  end
end
<%= form_for(@skill) do |skill_form| %>

    <div>
      <%= skill_form.label :math %><br />
      <%= skill_form.text_field :math %>
    </div>

    <div class="actions">
      <%= skill_form.submit 'Save' %>
    </div>

<% end %>


每当我尝试进入技能编辑表单时(http://localhost:3000/users/1/skills/edit),将引发以下错误:

ActionController::RoutingError in Skills#edit 

No route matches {:controller=>"skills"}

Extracted source (around line #1):

1: <%= form_for(@skill) do |skill_form| %>
2: 
3:     <div>
ActionController::路由技能错误#编辑
没有路由匹配{:controller=>“skills”}
提取的源(第1行附近):
1: 
2: 
三:
我知道我一定做错了什么。。。只是不知道是什么:|

提前感谢,,
布鲁诺

你的
获取技能
方法应该是创建一个类似这样的技能:

def get_skill
  user.skill || user.create_skill
end
这方面的
表单_,因为你在路线中的用户中嵌套了技能,应该是:

<%= form_for [@user, @skill] do |f| %>

将表单更改为:

form_for(@skill)
致:


不应该是
user.skill | | user.build_skill.save!;user.skill
?我按照Ryan和Zabba的建议进行了尝试,现在发生了以下错误:Skills中的NoMethodError#编辑未定义的方法'skill#u path',用于#提取的源代码(第1行附近):1:@Zabba:实际上
create#u skill
可以做到这一点。现在,如果你能取消你的反对票的话。@Bruno:我已经用正确的表格更新了我的答案。嗨,Ryan,谢谢你的帮助。仅当在my routes.rb中我将嵌套技能设置为plurar resources时,使用表单_并按照您建议的方式更改get_技能才能解决问题。但是,我不喜欢以这种方式生成的路由(users/1/skills/1/edit),因为每个用户只有一个技能,所以不需要在路径上设置技能id,这就是为什么我在嵌套技能上使用单一资源的原因。如果我将此单一资源保留在routes.rb上,则会发生以下错误:未定义的方法“user\u skill\u path”for#在表单_for行上。谢谢