Вложенные модели Rails 3 неизвестный атрибут Ошибка - PullRequest
5 голосов
/ 27 июля 2011
  • У меня есть модель "Issue" и вложенная модель "Relationship"
  • В Issue.rb я упомянул:

    has_many :relationships, :dependent => :destroy
    accepts_nested_attributes_for :relationships, :allow_destroy => true
    
  • В файле Relations.rb я упомянул:

    belongs_to :issue
    
  • Вслед за Ryan Bates Railcast # 196 У меня есть следующее в моем Issue_controller:

    relationship = @issue.relationships.build
    

Однако я вижу ошибку "неизвестный атрибут: отношение"

Я что-то здесь не так делаю?Я вижу, что атрибуты отношений передаются на сервер в журнале, однако, эта ошибка не позволяет успешному созданию.

Мой опыт работы с рельсами - уровень начинающих, поэтому прошу прощения, если я задаю вопросчто может считаться тривиальным.

Спасибо за помощь.

РЕДАКТИРОВАТЬ : соответствующий код контроллера:

    @relationship = @issue.relationships.build
    #@relationship = Relationship.new(params[:relationship])
    if @relationship.issue_id = ''
      @relationship.issue_id = @issueid
    end

    if @relationship.cause_id = ''
      @relationship.cause_id = @issueid
    end

    @relationship.save
    redirect_to(:back, :notice => 'New Relationship was created') 

Что я вижу на трассировке:

    ActiveRecord::UnknownAttributeError in IssuesController#create
    unknown attribute: relationship

Среди параметров Issue я вижу, что параметры отношений передаются, как и ожидалось:

    "relationship"=>{"issue_id"=>"100",
    "cause_id"=>""}

ДРУГОЕ ОБНОВЛЕНИЕ Публикация формы для кода:

    - form_for Issue.new do |f|

      .field  
        = f.text_field :description, :class=>"formfield", :id=>"frm_descr"

      .field  
        = f.hidden_field :wiki_url, :class=>"formfield", :id=>"frm_wiki_url"

      .field
        = f.hidden_field :short_url, :class=>"formfield", :id=>"frm_img_url"

      .field
        = f.hidden_field :title, :class=>"formfield", :id=>"frm_title"         

      = f.fields_for :relationship do |builder|
        = builder.text_field :issue_id, :class=>"form_field", :id=>"frm_rel_issue_id", :value=>@issue.id 
        = builder.text_field :cause_id, :class=>"form_field", :id=>"frm_rel_cause_id"

      .actions
        = f.submit 'Create', :class=>"save_button", :name=>"save_issue_rel_button", :id=>"val_collector"

Ответы [ 4 ]

9 голосов
/ 27 июля 2011

Изменить эту строку

= f.fields_for :relationship do |builder|

к этому:

= f.fields_for :relationships do |builder|

Ваша проблема имеет отношения с множеством людей. Это даст вам правильные параметры relations_attributes.

4 голосов
/ 28 июля 2011

Вот код работающего скелета: я создал новый проект, попробовал комбинацию других ответов и, наконец, заставил его работать.

Вот мое решение, после которого нужно следитьза.Я использую разные модели, поэтому терпите меня:

  • Мои модели: обсуждение has_many сообщений .
  • Дискуссия не имеет атрибутов.
  • Сообщений имеет содержимое: текст и обсуждение_ид: целое число.

Рабочий код

(модель) обсуждение.rb

has_many :posts
accepts_nested_attributes_for :posts

(модель) post.rb

belongs_to :discussion

rout.rb

resources :discussions do
  resources :posts
end

(обсуждениеview) _form.html.erb

<%= form_for(@discussion) do |f| %>
  <%= f.fields_for :posts, @post do |p| %>
    <%= p.text_area :content %>
  <% end %>
  <%= f.submit %>
<% end %>

(контроллер) Discussions_controller.rb

  def new
    @discussion = Discussion.new
    @post = @discussion.posts.build

    respond_to do |format|
      format.html # new.html.erb
      format.xml  { render :xml => @discussion }
    end
  end

  def create
    @discussion = Discussion.new(params[:discussion])

    respond_to do |format|
      if @discussion.save
        format.html { redirect_to(@discussion, :notice => 'Discussion was successfully created.') }
        format.xml  { render :xml => @discussion, :status => :created, :location => @discussion }
      else
        format.html { render :action => "new" }
        format.xml  { render :xml => @discussion.errors, :status => :unprocessable_entity }
      end
    end
  end

Возможные вещи, которые могут пойти не так

Во-первых, Тило былправильно, я получаю неизвестный атрибут: post , если я делаю

# WRONG!
f.fields_for :post

Во-вторых, я должен иметь переменную экземпляра @post в действии new , иначе сообщение.контекстная текстовая область не будет отображаться.

# REQUIRED!
@post = @discussion.posts.build

В-третьих, если я использую f.fields_for @ post , действие создания будет пожаловаться на неизвестный атрибут: post тоже.

# WRONG!
f.fields_for @post do |p|

Используйте это вместо:

# RIGHT!
f.fields_for :posts, @post  do |p|

Конец

Так что да, я бы хотел, чтобы мы увидели больше документации по этому вопросу (может 'не вижу каких-либо полезных).Например, я вижу некоторое использование form_for [@discussion, @post], но никогда не смогу заставить его работать.

0 голосов
/ 27 июля 2011

Используя accepts_nested_attributes, вы создали метод установки отношением_attributes =.

Я заметил, что есть пара вещей, которые нужно изменить.

Вам не нужно устанавливать

@relationship = @issue.relationships.build

Ваша форма должна быть следующей (у вас есть отношения f.fields_for:)

= form_for @issue do |f|

  # your issue fields here

  = f.fields_for :relationships do |r|

    # your relationship fields here

Прелесть здесь в том, что вам не нужно устанавливать какие-либо идентификаторы или что-либо.*

0 голосов
/ 27 июля 2011

Я предполагаю, что вы строите отношения в вашем контроллере, а затем пытаетесь использовать их в представлении.Чтобы это было видно, вы должны сделать его переменной экземпляра .Все, что вам нужно сделать, это добавить символ @ от имени relationship, как вы сделали с @issue.

@relationship = @issue.relationships.build

Редактировать: из-за дополнительной информации, предоставленной ФП послебыл задан исходный вопрос, теперь этот ответ явно не применим.

...