Rails 3 вложенные модели неизвестная ошибка атрибута
- у меня есть модель "проблема" и вложенная модель "отношения"
-
В номере.РБ я уже упоминал:
has_many :relationships, :dependent => :destroy accepts_nested_attributes_for :relationships, :allow_destroy => true
-
В отношениях.РБ я уже упоминал:
belongs_to :issue
-
После Ryan Bates Railcast#196 у меня есть следующее В моем issues_controller:
relationship = @issue.relationships.build
Однако я сталкиваюсь с ошибкой "неизвестный атрибут: отношение"
Я делаю здесь что-то неправильно? Я действительно вижу атрибуты отношений однако, будучи передана серверу в журнале, эта ошибка не позволяет создать успешно.
Мой опыт работы с rails-это уровень новичков, поэтому любезно извините меня, если я задаю вопрос, который, возможно, сочтен тривиальным.
Спасибо за помощь.
EDIT : соответствующий код контроллера:
@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
Среди параметров проблемы я вижу, что парамы отношений передаются как ожидается:
"relationship"=>{"issue_id"=>"100",
"cause_id"=>""}
ЕЩЕ ОДНО ОБНОВЛЕНИЕ Отправка кода form_for:
- 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 ответа:
Измените эту строку
= f.fields_for :relationship do |builder|
К этому:
= f.fields_for :relationships do |builder|
Ваша проблема имеет множество отношений-множественное число. Это даст вам правильные параметры relationships_attributes.
Вот рабочий скелет кода: Я создал новый проект и попробовал комбинацию других ответов, и, наконец, это сработало.
Вот мое решение, после этого есть вещи, которые нужно остерегаться. Я использую разные модели, так что потерпите:
- мои модели: Обсуждение has_many сообщения.
- Обсуждение не имеет атрибутов.
- сообщения имеет содержание: текст и discussion_id: целое число.
Рабочий Код
(модель) обсуждение.rb
has_many :posts accepts_nested_attributes_for :posts
(модель) пост.rb
belongs_to :discussion
Маршруты.rb
resources :discussions do resources :posts end
(вид обсуждения) _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 действие иначе пост.контекст textarea не будет отображаться.
В-третьих, если я использую f.fields_for @post, действие create будет жаловаться неизвестный атрибут: post тоже.# REQUIRED! @post = @discussion.posts.build
# WRONG! f.fields_for @post do |p|
Используйте вместо этого:
# RIGHT! f.fields_for :posts, @post do |p|
Конец
Так что да, я хочу, чтобы мы увидели больше документов по этому вопросу (не вижу никаких полезных). Например, я вижу некоторое использование form_for [@обсуждение, @сообщение], но я никогда не могу заставить его работать.
Используя accepts_nested_attributes, вы создали метод-сеттер relationship_attributes=.
Есть пара вещей, которые я заметил, которые нужно изменить.Вам не нужно устанавливать
@relationship = @issue.relationships.build
Ваша форма должна быть следующей (у вас есть f. fields_for: relationship)
= form_for @issue do |f| # your issue fields here = f.fields_for :relationships do |r| # your relationship fields here
Прелесть здесь в том, что вам не придется устанавливать какие-либо идентификаторы или что-либо еще.
Я предполагаю, что вы строите отношения в своем контроллере, а затем пытаетесь использовать их в представлении. Для того, чтобы это было видно, вы должны сделать его переменной экземпляра . Все, что вам нужно сделать, это бросить символ @ от имени
relationship
, Как вы сделали с@issue
.@relationship = @issue.relationships.build
Edit: из-за дополнительной информации, предоставленной ОП после того, как был задан первоначальный вопрос, этот ответ теперь явно не применим.