2013-04-08 1 views
0

Я пытаюсь получить текст из поля text_area в форме для сохранения в базе данных в другой модели с идентификатором текущей модели.Сохранение в другой базе данных модели с текущим идентификатором записи формы - Rails

В настоящее время это работает, но только сохраняет целые числа. Если я поместил текст в поле «Примечания», то он сохранит его как «0». Я подозреваю, что это работает правильно, но мне не хватает части моей головоломки. Это связано с тем, что я хочу, чтобы «Ticket» сохранил note_id, потому что у меня будет несколько «Notes» per 'Ticket.

Как я могу получить примечание для сохранения в модели заметок с идентификатором и связать это note_id с этим конкретным билетом?

Форма - /app/views/tickets/_form.html.erb

<%= form_for(@ticket) do |f| %> 
<% if @ticket.errors.any? %> 
<div id="error_explanation"> 
<h2><%= pluralize(@ticket.errors.count, "error") %> prohibited this ticket from being saved:</h2> 
<ul> 
<% @ticket.errors.full_messages.each do |msg| %> 
<li><%= msg %></li> 
<% end %> 
</ul> 
</div> 
<% end %> 

<div class="field"> 
    <%= f.fields_for :notes do |u|%> 
    <%= u.label :note %> 
    <%= u.text_area :note, :size => "101x4", :placeholder => "Leave notes here." %> 
<% end %> 
</div> 

<div class="actions"> 
    <%= f.submit %> 
</div> 
<% end %> 

Tickets_controller.rb

class TicketsController < ApplicationController 
# GET /tickets 
# GET /tickets.json 
def index 
@tickets = Ticket.all 

respond_to do |format| 
    format.html # index.html.erb 
    format.json { render json: @tickets } 
end 
end 

# GET /tickets/1 
# GET /tickets/1.json 
def show 
@ticket = Ticket.find(params[:id]) 

respond_to do |format| 
    format.html # show.html.erb 
    format.json { render json: @ticket } 
end 
end 

# GET /tickets/new 
# GET /tickets/new.json 
def new 
@ticket = Ticket.new 
@ticket.notes.build 

respond_to do |format| 
    format.html # new.html.erb 
    format.json { render json: @ticket } 
end 
end 

# GET /tickets/1/edit 
def edit 
@ticket = Ticket.find(params[:id]) 
end 

# POST /tickets 
# POST /tickets.json 
def create 
@ticket = Ticket.new(params[:ticket]) 

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

# PUT /tickets/1 
# PUT /tickets/1.json 
def update 
@ticket = Ticket.find(params[:id]) 

respond_to do |format| 
    if @ticket.update_attributes(params[:ticket]) 
    format.html { redirect_to @ticket, notice: 'Ticket was successfully updated.' } 
    format.json { head :no_content } 
    else 
    format.html { render action: "edit" } 
    format.json { render json: @ticket.errors, status: :unprocessable_entity } 
    end 
end 
end 

# DELETE /tickets/1 
# DELETE /tickets/1.json 
def destroy 
@ticket = Ticket.find(params[:id]) 
@ticket.destroy 

respond_to do |format| 
    format.html { redirect_to tickets_url } 
    format.json { head :no_content } 
end 
end 
end 

Note.rb

class Note < ActiveRecord::Base 
belongs_to :ticket 
attr_accessible :note, :ticket_id 
end 

Ticket.rb

class Ticket < ActiveRecord::Base 
attr_accessible :notes_attributes 
accepts_nested_attributes_for :notes 
end 

ответ

4

Это происходит потому, что note_id является integer типа.

Использование nested models: Refer this for Nested Models

Модель:

class Ticket < ActiveRecord::Base 
    has_many :notes 
    attr_accessible :note_id, :notes_attributes 
    accepts_nested_attributes_for :notes 
end 

Вид:

<%= form_for(@ticket) do |f| %> 
    <%= f.fields_for :notes do |u|%> 
     <%= u.label :note %> 
     <%= u.text_area :note %> 
    <% end %> 
    <%= f.submit 'Submit' %> 
<% end %> 
+0

Спасибо - я хочу, чтобы он сохранил note_id здесь, чтобы часть была правильной. Но я не могу понять, как получить заметку для сохранения в базе данных Note Model и связать «note_id» с «ticket_id». Есть предположения? – Devin

+0

Почему у вас есть «note_id» в модели билета? – codeit

+0

@codeit Вы правы, он не нуждается в этом. Его модель/строка Note будет иметь столбец 'ticket_id'. –

2

Что у вас есть вложенная ассоциация с Ticket как "родитель" , Связь определяется ссылкой от note_id в модели Note к id (первичный ключ) Ticket. То, что вы сейчас делаете сейчас, вручную манипулирует этой числовой ассоциацией. Rails, зная, что столбец note_id должен быть целым числом, берет текст, который вы пытаетесь вставить, и превращая его в число (нуль в этом случае). Из-за этого у вас, вероятно, есть куча сиротских строк.

В конечном счете, чтобы выполнить то, что вы пытаетесь сделать, ваша форма должна будет содержать поля для этой ассоциированной модели. Один из способов справиться с этим - использовать accepts_nested_attributes_for в вашей модели Ticket.Как так:

class Ticket < ActiveRecord::Base 
    has_many :notes 
    accepts_nested_attributes_for :notes 
end 

И в вашей форме, вы можете легко создать вложенную форму следующим образом:

<%= form_for(@ticket) do |f| %> 
    <div class="field"> 
     <%= f.fields_for :notes do |f_notes|%> 
      <%= f_notes.label :note %><br /> 
      <%= f_notes.text_area :note, :size => "101x4", :placeholder => "Please leave notes here."%> 
     <% end %> 
    </div> 
<% end %> 

Редактировать Почти забыл: Проверьте это Railscast from Ryan Bates дело с вложенными Атрибуты

Редактировать 2 Как указал код, вам не нужен attr_accessible :note_id в Билете. Поскольку вы указали, что Ticket имеет много Notes и что Note относится к Ticket, столбец внешнего ключа появится в модели Note как ticket_id, который у вас уже есть. Наличие note_id в модели билета бесполезно, а также бессмысленно, так как has_many описывает множественное отношение (которое не может быть выражено одним столбцом).

+0

Это определенно имеет смысл, спасибо за то, что вы так тщательно. Однако он не сохраняет текст в поле «Примечания». Когда я вернусь, чтобы изменить билет, поле заметок пуст. – Devin

+0

@Devin Так оно не появляется на форме? Хм, это поле примечаний для этого конкретного билета, заполненного в базе данных, по крайней мере? –

+0

Спасибо за постоянную поддержку. Поле действительно там, просто пустое (с текстом-заполнителем). Когда в представлении списка данных в моей модели заметок, там ничего не появляется. – Devin