これはこれまでに多くのことで尋ねられてきましたが、かなり適用されるものは見つかりませんでした。私がしようとしているのは、SettingsController
の編集フォームを編集ビューのUsersController
にレンダリングすることです。私はRoRの新人ですので、私が間違っていることさえ分かりません。ビューの1つのコントローラのform_forを部分的に保存できません。レール4
This質問に最も近いようだが、私はUsers
コントローラで@setting = Setting.new
を初期化するとき、私は、移行中に新しいユーザーに対して設定デフォルトなしSettings
フォームを取得します。しかし、@setting = Setting.edit
またはSetting.update
を初期化すると、定義されていないメソッドまたは引数の数が正しくないというエラーが発生します。私は、データベースをチェックすると
undefined method for find_by_id in the SettingsController: app/controllers/settings_controller.rb:43:in `correct_user'.
、ユーザーが作成されたとき、レコードが正しく作成されている設定が、設定レコードが更新されません。Setting.new
フォームが保存されている
は、それがこのエラーがスローされますフォームが保存されます。
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
がUserController:
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
SettingsController:
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
正しく保存されましたか?
をcurrent_user.setting =
ちょうど@settingあなたの移行を含めてください特に既定値が挙げられます。これにより、プロジェクトの状況に応じた適切な回答が得られます。 –
@MichaelGaskill、ちょうどそれを追加しました –
私は 'new'アクションで私の答えに追加しました。 –