1

Я создал список файлов, загруженных разными пользователями.Используйте индекс для маркировки результатов в рельсах 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 
+0

is current_user в def create nil? –

ответ

2

, так что вы пытаетесь объединить user_id (который является целым числом) с пользователем (который является объектом). вам нужно убедиться, что у вас есть соответствующие типы. один способ переписать:

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 

можно также добавить скрытое поле в форме, для: user_id,: значение => CURRENT_USER.ID

+0

У меня появилось сообщение об ошибке: undefined метод 'merge 'для # . Я обновлю свой первоначальный вопрос. –

0

мне удалось передать идентификатор пользователя при помощи скрытого поля:

<%= 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.hidden_field :user_id, :value => @user.id %> 
    <%= form.file_field :sound_file %> 
    <%= form.submit %> 

В контроллере:

def create 
    @sound = Sound.create(sound_params) 
    redirect_to :action => "show", :id => @sound.id, :user_id => current_user 
    end 


def sound_params 
    params.require(:sound).permit(
     :sound_file, 
     :sound_name, 
     :description, 
     :location, 
     :user_id) 
end 
0

нашел другой способ. Поскольку я устанавливаю начальные отношения в моделях, я могу просто сделать это.

def create 
    @sound = current_user.sounds.create(sound_params) 
    redirect_to :action => "show", :id => @sound.id, :user_id => current_user 
    end 

    private 

def sound_params 
    params.require(:sound).permit(
    :sound_file, 
    :sound_name, 
    :description, 
    :location 
    ) 
end 

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

  • Нет связанных вопросов^_^