2015-09-18 2 views
1

Im работает над простым приложением здесь, которому нужна страница настроек, так как я новичок в рельсах. Я немного потерялся здесь. Я хотел бы настроить его в базе данных с одним столбцом как ключом и одним столбцом в качестве значения. У меня уже есть несколько настроек, но у меня возникают проблемы с получением форм для обновления настроек.Rails update ActiveRecord из формы

Все, что я хочу сделать, это создать одну страницу настроек с несколькими настройками, которые можно изменить в ней. теперь все настройки будут текстовыми полями. С моим текущим кодом im получает ошибку «неопределенный метод` to_key »для #". так вот некоторый код:

модель: setting.rb

class Setting < ActiveRecord::Base 
    def self.method_missing(method_name, *args, &block) 
    if method_name[-1] == '=' 
     handle_set_setting method_name.to_s.delete("="), args.first 
    else 
     handle_get_setting method_name 
    end 
    end 

    private 

    def self.handle_get_setting(name) 
    if setting = Setting.find_by(key: name.to_s) 
     setting.value unless setting.value.empty? 
    else 
     nil 
    end 
    end 

    def self.handle_set_setting(name, value) 
    if setting = Setting.find_or_create_by(key: name.to_s) 
     setting if setting.update(value: value.to_s) 
    end 
    end 
end 

Вот мой settings_controller.rb (. Im 100% уверен, что я не имею много правильно здесь)

class SettingsController < ApplicationController 
    before_action :set_settings, only: [:edit, :update, :show] 
    def index 
    @settings = Setting.all 
    end 

    def new 
    @settings = Setting.new 
    end 


    def update 
    @settings.update(params) 
    end 

    private 

    def params 
     params.require(:key).permit(:value, :etc) 
    end 
    def set_settings 
     @settings = Setting.find params[:key] 
    end 

end 

и вот мой index.html.erb (уверен, что все это неправильно)

<h2> Settings </h2> 

<h3> Movie Settings </h3> 
<%= form_for(@settings) do |f| %> 
<%= f.hidden :key => "cp_api" %> 
<%= f.label :value %><br> 
<%= f.text_field :value %> 
<%= f.submit %> 
<% end %> 

Вот журнал ошибок:

Started GET "/settings" for ::1 at 2015-09-18 00:57:24 -0400 
Processing by SettingsController#index as HTML 
    Setting Load (0.1ms) SELECT "settings".* FROM "settings" 
    Rendered settings/index.html.erb within layouts/application (3.6ms) 
Completed 500 Internal Server Error in 7ms (ActiveRecord: 0.1ms) 

ActionView::Template::Error (undefined method `to_key' for # <Setting::ActiveRecord_Relation:0x007fa186b88128>): 
    1: <h2> Settings </h2> 
    2: 
    3: <h3> Settings </h3> 
    4: <%= form_for(@settings) do |f| %> 
    5: <%= f.hidden :key => "cp_api" %> 
    6: <%= f.label :value %><br> 
    7: <%= f.text_field :value %> 
    app/views/settings/index.html.erb:4:in `_app_views_settings_index_html_erb__4580226212883122031_70165864193720' 

Я уверен, что что-то действительно легко понять, но я просто потерялся здесь, я бил головой в течение 2 дней по этой проблеме, и я просто не могу понять это.

Спасибо!

+0

На какой строке вы получаете эту ошибку? Можете ли вы опубликовать журнал ошибок в вопросе? – Pavan

+0

Попробуйте изменить 'params.require (: key) .permit (: value,: etc)' to 'params.require (: setting) .permit (: value,: etc)' –

+0

@Pavan добавил журнал ошибок, ошибка в строке 4 index.html.erb – djbartos93

ответ

1

Вам нужно добавить @setting = Setting.New к вашему методу index как ниже

def index 
    @settings = Setting.all 
    @setting = Setting.new 
end 

и изменить <%= form_for(@settings) do |f| %> к <%= form_for(@setting) do |f| %>

Кроме того, необходимо изменить метод params ниже

def params 
    params.require(:setting).permit(:value, :key) 
end 

И изменить <%= f.hidden :key => "cp_api" %> - < %= f.hidden_field :key => "cp_api" %>, чтобы избежать дальнейших проблем

+0

хорошо! который заставил его работать по большей части, однако теперь я получаю ошибку SystemStackError (уровень стека слишком глубокий): app/controllers/settings_controller.rb: 33: in 'params ' – djbartos93

+0

понял это! Благодаря!!!! – djbartos93

+0

@ djbartos93 Можете ли вы сказать, что вызвало эту ошибку? – Pavan

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