Я создал список файлов, загруженных разными пользователями.Используйте индекс для маркировки результатов в рельсах 4
2 Pen writing 83746__braffe2__pen-writing.wav audio/wav 1057836 2013-11-17 03:43:29 UTC
3 Pen writing 83746__braffe2__pen-writing.wav audio/wav 1057836 2013-11-17 03:46:26 UTC
4 Pen writing 83746__braffe2__pen-writing.wav audio/wav 1057836 2013-11-17 03:51:41 UTC
5 Pen writing 83746__braffe2__pen-writing.wav audio/wav 1057836 2013-11-17 03:55:48 UTC
Вот фрагмент кода, который генерируется список:
<% @sounds.each do |sound| %>
<%= sound.id %>
<%= sound.sound_name %>
<%= sound.rating %>
<%= sound.user_id %>
<%= sound.sound_file_file_name %>
<%= sound.sound_file_content_type %>
<%= sound.sound_file_file_size %>
<%= sound.sound_file_updated_at %>
<%= button_to "Download", download_path(sound.id), :method => :get %>
<% end %>
Однако, я хочу показать, какой пользователь загрузил какой файл. Пользователь может иметь много звуков, а звуки принадлежат пользователю. Я использую postgresql в качестве моей базы данных.
class User < ActiveRecord::Base
has_many :sounds
end
class Sound < ActiveRecord::Base
belongs_to :user
end
С моей схеме:
create_table "sounds", force: true do |t|
t.string "description"
t.integer "rating"
t.string "location"
t.integer "user_id"
t.datetime "created_at"
t.datetime "updated_at"
t.string "sound_file_file_name"
t.string "sound_file_content_type"
t.integer "sound_file_file_size"
t.datetime "sound_file_updated_at"
t.string "sound_name"
end
add_index "sounds", ["user_id"], name: "index_sounds_on_user_id", using: :btree
Из того, что я могу сказать, то user_id поле не наполняется по какой-то причине. Из моего контроллера:
def new
@sound = Sound.new
@user = User.find(params[:user_id])
end
def create
@sound = Sound.create(sound_params)
redirect_to :action => "show", :id => @sound.id, :user_id => current_user
end
private
# Use strong_parameters for attribute whitelisting
# Be sure to update your create() and update() controller methods.
def sound_params
params.require(:sound).permit(
:sound_file,
:sound_name,
:description,
:location,
:user_id => current_user)
end
Вот форма, которую пользователь использует для создания звука:
<%= form_for [@user, @sound], :url => "https://stackoverflow.com/users/:user_id/sounds", :html => { :multipart => true } do |form| %>
<%= form.text_field :sound_name, placeholder: "Sound name" %>
<%= form.text_field :description, placeholder: "Description" %>
<%= form.text_field :location, placeholder: "Location" %>
<%= form.file_field :sound_file %>
<%= form.submit %>
<% end %>
Не уверен, что я делаю неправильно? Или я просто полностью недопонимаю, как индекс работает в Rails?
UPDATE 1
Я сделал следующие изменения в моем контроллере:
def create
@sound = Sound.create(sound_params).merge(:user_id => current_user.id)
redirect_to :action => "show"
end
def sound_params
params.require(:sound).permit(
:sound_file,
:sound_name,
:description,
:location,
:user_id)
end
Я закончил с этим сообщением об ошибке:
undefined method `merge' for #<Sound:0x007fa6a4a61ec0>
Похоже, это проблема линии :
@sound = Sound.create(sound_params).merge(:user_id => current_user.id)
Я предполагаю, что Rails безумный, потому что объект Sound не поставляется с функцией слияния. Я как бы удивлен, какая боль. Я просто хочу иметь возможность выбирать звуки, принадлежащие пользователю. Думаю, я не совсем понимаю, как эти отношения реализованы с помощью рельсов.
Я заметил это в одном из моих миграций:
class CreateSounds < ActiveRecord::Migration
def change
create_table :sounds do |t|
t.string :sound_name
t.string :description
t.integer :rating
t.string :location
t.references :user, index: true
t.timestamps
end
end
Однако, когда я смотрю на свою базу данных, я не вижу каких-либо ссылок на пользователя в столбцах.
HearHere_development=# SELECT * from sounds;
id | description | rating | location | user_id | created_at | updated_at | sound_file_file_name | sound_file_content_type | sound_file_file_size | sound_file_updated_at | sound_name
is current_user в def create nil? –