【发布时间】:2016-06-18 23:27:58
【问题描述】:
这已经被问过很多了,但我找不到任何非常适用的东西。我要做的是在UsersController 的编辑视图中为SettingsController 呈现一个编辑表单。我对 RoR 非常陌生,所以我什至不确定自己做错了什么。
This 问题似乎最接近,但是当我在Users 控制器中初始化@setting = Setting.new 时,我得到一个Settings 表单,没有为迁移中的新用户设置默认值。但是如果我初始化@setting = Setting.edit 或Setting.update,我会得到一个未定义的方法或错误数量的参数错误。
当Setting.new 表单被保存时,它会抛出这个错误:
SettingsController 中 find_by_id 的未定义方法:app/controllers/settings_controller.rb:43:in `correct_user'。
当我检查数据库时,在创建用户时设置记录正在正确创建,但在保存表单时设置记录没有更新。
setting.rb:
class Setting < ActiveRecord::Base
belongs_to :user
validates :user_id, presence: true
end
user.rb:
class User < ActiveRecord::Base
has_many :posts, dependent: :destroy
has_one :setting, dependent: :destroy
after_create :create_setting
end
用户控制器:
class UsersController < ApplicationController
before_action :logged_in_user, only: [:edit, :update, :index, :destroy]
before_action :correct_user, only: [:edit, :update]
before_action :admin_user, only: :destroy
def new
@user = User.new
end
def edit
@user = User.find(params[:id])
@setting = Setting.update
end
def update
@user = User.find(params[:id])
@setting = Setting.update
if @user.update_attributes(user_params)
flash[:success] = "Profile updated!"
redirect_to @user
else
render 'edit'
end
end
def settings
@title = "Settings"
@setting = Setting.find_by_user_id(params[:user_id])
end
private
def user_params
params.require(:user).permit(:name, :email, :password,
:password_confirmation)
end
# Confirms the correct user.
def correct_user
@user = User.find(params[:id])
redirect_to(root_url) unless current_user?(@user)
end
end
设置控制器:
class SettingsController < ApplicationController
before_action :logged_in_user, only: [:create, :edit, :update, :show, :index]
before_action :correct_user, only: [:create, :edit, :update, :show, :index]
def index
@settings = Setting
end
def show
@setting = User.find(params[:id]).setting
end
def new
@setting = Setting.new
end
def edit
@setting = Setting.find(params[:id])
end
def create
@setting = current_user.settings.build(setting_params)
@setting.save
end
def update
@setting = Setting.find(params[:id])
if @setting.update_attributes(post_params)
flash[:success] = "Settings updated!"
redirect_to request.referrer
else
render 'edit'
end
end
private
def setting_params
params.require(:setting).permit(:reading_theme)
end
def correct_user
@setting = current_user.setting.find_by_id(params[:id]) ##the line which throws an error when the form is saved
redirect_to root_url if @setting.nil?
end
end
表格部分:
<%= form_for(@setting) do |f| %>
<%= render 'shared/error_messages', object: f.object %>
<div class="field">
<%= radio_button_tag(:reading_theme, "flatly") %>
<%= label_tag(:reading_theme_flatly, "Light (Default)") %>
</div>
<div class="field">
<%= radio_button_tag(:reading_theme, "darkly") %>
<%= label_tag(:reading_theme_darkly, "Dark") %>
</div>
<%= f.submit yield(:button_text), class: "btn btn-primary" %>
<% end %>
routes.rb:
resources :users do
member do
get :following, :followers
end
end
resources :settings, only: [:new, :create, :edit, :update]
...
ETA:设置迁移:
class CreateSettings < ActiveRecord::Migration
def change
create_table :settings do |t|
t.string :reading_theme, default: => "flatly"
t.references :user, index: true, foreign_key: true
t.timestamps null: false
end
end
end
如何获得正确的默认值以便正确保存我的表单?
【问题讨论】:
-
请包括您提到的迁移,尤其是默认值。这将在您的项目环境中得出合适的答案。
-
@MichaelGaskill,刚刚添加了它
-
我刚刚在
new操作中将其添加到我的答案中。
标签: ruby-on-rails ruby ruby-on-rails-4 activerecord