2012-02-07 2 views
0

Пусть мы имеем модель Lyric:Rails две соединенные модели в одной точке зрения

class Lyric < ActiveRecord::Base 
    belongs_to :song 
end 

и модель Song:

class Song < ActiveRecord::Base 
    has_many :artist, :through => :artistsong 

    belongs_to :album 

    has_one :lyric 
    accepts_nested_attributes_for :lyric #is this needed? 
end 

Миграция сценариев для песен:

class CreateSongs < ActiveRecord::Migration 
    def change 
    create_table :songs do |t| 
     t.integer :track 
     t.string :name 
     t.references :album 
     t.timestamps 
    end 
    add_index :songs, :album_id 
    end 
end 

сценарий миграции для текстов:

class CreateLyrics < ActiveRecord::Migration 
    def change 
    create_table :lyrics do |t| 
     t.text :lyric 
     t.references :song 
     t.timestamps 
    end 
    add_index :lyrics, :song_id 
    end 
end 

И предположим, что у меня есть песня под названием «song 1» и ее тексты, прикрепленные в базе данных.

так песня таблицы:

|id|name    | 
------------------------- 
|1 |song1    | 

и текст таблицы:

|id|song_id|lyrics    | 
--------------------------------- 
|1 |1  |blahblah   | 

в методе редактирования в song_controller.rb в:

# GET /songs/1/edit 
def edit 
    @song = Song.find(params[:id], :include=>:lyric) 
end 

Это мнение для редактирования песня: (после исправления, предложенного Маттео)

<%= form_for(@song) do |f| %> 
    <div class="field"> 
    <%= f.label :name %><br /> 
    <%= f.text_field :name %> 
    </div> 
    <% f.fields_for :song_text do |child_form| %> 
    <%= child_form.label :lyrics %><br /> 
    <%= child_form.text_field :lyrics %> 
    <% end %> 
    <div class="actions"> 
    <%= f.submit %> 
    </div> 
<% end %> 

если я:

<%= debug(@song.lyric) %> 

Я могу видеть содержимое лирики:

--- !ruby/object:Lyric 
attributes: 
    id: 1 
    song_text: hid 
    song_id: 2 
    created_at: 2012-02-07 00:59:14.000000000Z 
    updated_at: 2012-02-07 07:21:57.000000000Z 

Но в представлении текстовое поле для лирики исчез полностью ...

I хотите, чтобы иметь возможность редактировать имя песни и лирику в той же форме, возможно ли это?

Благодаря

+0

Добавлен сценарий миграции для текстов и песен – Bill

+0

вы может попытаться изменить название поля, содержащего лирику, в тексте таблицы и использовать новый в полях_for. Может быть, что-то вроде song_text или lyric_text. –

+0

Извините, я первый пользователь ruby, я думаю, что я изменил правильные места. – Bill

ответ

3

Попробуйте изменить: лиричный в fields_for, так как имя поля в таблице лирике не лирическое, но текст

<% f.fields_for :lyric do |child_form| %> 
    <%= child_form.label :lyrics %><br /> 
    <%= child_form.text_field :lyrics %> 
<% end %> 
+0

Спасибо большое! получил его работу с: <% = f.fields_for: lyric do | l | %> <% = l.label: song_text%>
<% = l.text_area: song_text%> <% end %> – Bill

0
<%= child_form.label :lyric %><br /> 
<%= child_form.text_field :lyric %> 

Если оба :lyricsмножественный, не :lyric

+0

есть отношение 'has_one: lyric' –

+1

@SandipRansing Да, и' fields_for: lyric' уже выбрал ассоциацию 'lyric'. Объект 'Lyric' имеет одно поле под названием' lyrics', которое должно быть введено в помощники 'label' и' text_field'. Ответ стоит, и он правильный, как вы можете видеть из принятого ответа. – meagar

Смежные вопросы