2015-04-22 2 views
0

Мне не удается вставить данные в таблицу user_preferences, где, когда я получаю все атрибуты в параметрах. Я попытался вставить значение из консоли, следуя пути, так как связь между HAS_ONE пользователя user_preference и UserPreference belongs_to Пользователь:Невозможно вставить данные в таблицу, используя форму для отправки данных

user = User.find(1) 
user.user_preferences.title = "MyTitle" 

я получаю неопределенный метод "титул"

user_preference.rb

class UserPreference < ActiveRecord::Base 
    belongs_to :user 

    def self.bgcolor_options 
     [["Orange", "#FF3300"], ["Green", "#00FF00"], ["Blue", "#0000FF"], ["Pink", "#FF0066"], ["Yellow", "#FFFF00"], ["White", "#FFFFFF"]] 
    end 
    def self.font_options 
     [["Times New Roman", "Times New Roman"], ["Verdana", "Verdana"],["Arial", "Arial"],["sans-serif", "sans-serif"]] 
    end 
end 

user_preferences_controller.rb

class UserPreferencesController < ApplicationController 
    def new 
     @user_preference = UserPreference.new 
    end 

    def create 
     @user_preference = UserPreference.new(user_pref_params) 
     @user_preference.save unless user_signed_in? 
     render 'user_preferences/new' 
    end 
    def edit 
    end 
    def update 
    end 

    private 
    def user_pref_params 
     params.require(:user_preference).permit(:title, :bgcolor, :font, :description) 
    end 
end 

routes.rb

Rails.application.routes.draw do 

    resources :user_preferences 
    post "/user_preferences/new" 
    devise_for :users 
    devise_scope :user do 
    authenticated :user do 
     root :to => 'user_preferences#new', as: :authenticated_root 
    end 
    unauthenticated :user do 
     root :to => 'devise/registrations#new', as: :unauthenticated_root 
    end 
    end 

user_preferences/new.html.erb

<%= form_for @user_preference, :url => { :action => "create" } do |u|%> 
<div style="background-color:#{current_user.user_preference.bgcolor.nil? ? '#FFFFFF' : current_user.user_preference.bgcolor}"> 
<p> 
    <%= u.label :title %><br> 
    <%= u.text_field :title %> 
    </p> 

    <p> 
    <%= u.label :description %><br> 
    <%= u.text_field :description %> 
    </p> 

    <p> <%= u.label :back_ground_color %><br> 
    <%= u.select :bgcolor, options_for_select(UserPreference.bgcolor_options) %> 
    </p> 

    <p> 
    <%= u.label :font %><br> 
    <%= u.select :font, options_for_select(UserPreference.font_options) %> 

    </p> 

<br > 
    <p> 
    <%= u.submit %> 
    </p> 
    <hr > 
    <div style="background: #{current_user.user_preferences.bgcolor};"></div> 
    <div style="background-color:#{current_user.user_preferences.font.nil? ? 'Arial' : current_user.font}"> 
    This is the changes made in background 
    </div> 

</div> 

<% end %> 

schema.rb

ActiveRecord::Schema.define(version: 20150422034042) do 

    create_table "user_preferences", force: :cascade do |t| 
    t.text  "title" 
    t.string "font" 
    t.text  "description" 
    t.string "bgcolor" 
    t.datetime "created_at", null: false 
    t.datetime "updated_at", null: false 
    t.integer "user_id" 
    end 

    create_table "users", force: :cascade do |t| 
    t.string "email",     default: "", null: false 
    t.string "encrypted_password",  default: "", null: false 
    t.string "reset_password_token" 
    t.datetime "reset_password_sent_at" 
    t.datetime "remember_created_at" 
    t.integer "sign_in_count",   default: 0, null: false 
    t.datetime "current_sign_in_at" 
    t.datetime "last_sign_in_at" 
    t.string "current_sign_in_ip" 
    t.string "last_sign_in_ip" 
    t.datetime "created_at" 
    t.datetime "updated_at" 
    end 

    add_index "users", ["email"], name: "index_users_on_email", unique: true 
    add_index "users", ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true 

end 

Добавление User.rb код

class User < ActiveRecord::Base 
    # Include default devise modules. Others available are: 
    # :confirmable, :lockable, :timeoutable and :omniauthable 
    has_one :user_preference 
    devise :database_authenticatable, :registerable, 
     :recoverable, :rememberable, :trackable, :validatable 

end 

ответ

1

Вы доступ к неправильному ассоциации на user:

user.user_preferences.title = "MyTitle" 

user_preferences является has_many объединение и возвращает несколько объектов. Сама ошибка также упоминает это (что-то вроде ActiveRecord_Associations_CollectionProxy).

Просто доступ к has_one ассоциации, и он будет работать:

user.user_preference.title = "MyTitle" 
+0

Извините, но я не получил свою точку зрения, как user_preferences является has_many ассоциации – cyborg

+0

Сейчас я 'm guessing' has_many: user_pref erences' (множественное число) также определяется в вашем классе 'User', а также' has_one: user_preferences' (единственное число). Если это не так, отправьте код с вашей модели User, а затем я могу вам помочь. – fivedigit

+0

Я добавил модель пользователя – cyborg

0

для консольной части его не яваскрипт если вы хотите установить в отношении вы должны использовать variabel для назначения, а не использовать user_preference (с) принять к сведению с и его HAS_ONE отношений, и она должна быть user_preference и в вашей модели пользователя должен быть

# User Model 
has_one :user_preference 

# Console 
user = User.first 
preferences = user.user_preference 
preferences.title = "MyTitle" 
preferences.save 
user.reload.preferences.title # should be "MyTitle" 
Смежные вопросы