Ruby on Rails: невозможно отобразить представление редактирования вложенной модели - PullRequest
0 голосов
/ 30 декабря 2010

Я новичок в рельсах, и я застрял с проблемой, которую я не могу понять. Я объясню свой сценарий:

У меня есть модель User, созданная с помощью Devise. Я создал другую модель под названием Skill (математика: целочисленная наука: целое число), которая ссылается на пользователя:

- skill belongs_to :user 
- user has_one :skill

Я изменил файл маршрутов, чтобы умение имело вложенные маршруты внутри пользователя:

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

# Skills
resources :users do
  resource :skills
end

Я создал SkillsController с действиями edit и update. Код следующий:

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

В конечном итоге мой вид views / skills / edit.html.erb выглядит следующим образом:

<%= 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>

Я знаю, что, должно быть, я делаю что-то не так ... просто не могу понять, что: |

Спасибо заранее, Bruno

Ответы [ 2 ]

0 голосов
/ 30 декабря 2010

Измените форму для:

form_for(@skill)

на:

form_for([@skill.user, @skill])
0 голосов
/ 30 декабря 2010

Ваш метод get_skill должен создавать умение, подобное этому:

def get_skill
  user.skill || user.create_skill
end

form_for для этого, потому что у вас есть навыки, вложенные в пользователей в маршрутах, должно быть так:

<%= form_for [@user, @skill] do |f| %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...