2014-09-14 2 views
0

는 사용자의 설정을 만들었지 만 사용자 ID없이 부착 I가 설정을 만들 때마다 현재 그렇게허용 중첩 자원 생성 내 레일 4

resources :user do 
    resource :setting 
end 

같이 중첩 설정은 개체가되는 앱 그것에. 아마도 이것은

def setting_params 
    params.require(:setting).permit(:region, :publish_to, :language) 
end 

스트립 때문일 것으로 추정됩니다.

# GET /settings/new 
def new 
@setting = Setting.new 
end 

# GET /settings/1/edit 
def edit 
end 

# POST /settings 
# POST /settings.json 
def create 
@setting = Setting.new(setting_params) 

respond_to do |format| 
    if @setting.save 
    format.html { redirect_to user_setting_path(@setting, current_user), notice: 'Setting was successfully created.' } 
    format.json { render :show, status: :created, location: user_setting_path } 
    else 
    format.html { render :new } 
    format.json { render json: @setting.errors, status: :unprocessable_entity } 
    end 
end 
end 

줄에 :user_id을 추가하면 아무 것도 변경되지 않습니다.

어떻게 사용자를 여기에 붙일 수 있습니까?

+0

당신은 당신이'id' 여부라는 PARAM이있는 경우 검사 할 수 있습니다, 내가 만드는 작업을 내부 –

+0

에 컨트롤러에서 작업 블록을 추가 할 수 있습니다 ? – bnassler

+0

위를 부착 질문 –

답변

0

@ 모함마드 아부 샤디 :별로는 아니지만, 당신은 저를 넘어서서 우연히 발견했습니다. 엔! 감사!!

당신 말이 맞았으니 :user_id이 올바른 키였습니다.

비록 내가 틀렸다면 나를 고쳐주십시오. 다만, user_id를 선택하면 다른 사용자에게 설정을 지정할 수 있습니다 (다른 user_id에 밀입국 함으로서).

내가 나를 current_user 방법에 액세스하여 현재 사용자를 찾을 수있는 보석을 사용하고 있기 때문에, 지금 내 코드 작품은 다음과 같습니다

@setting = User.find(params[:user_id]).create_setting(setting_params) 

또는 함께 만들기 아마도 그래서 이상하게 방법

@setting = User.find(current_user).create_setting(setting_params) 

을 "저장", .setting.new는 (나를 위해 설정을 작동하지 않았다 어느 쪽도하지 않았다) 그러나 편의는 create_setting했다. 이유를 아시나요 ??

는 업데이트

def update 
    #@setting = params[:setting] 
    #@setting = current_user.setting 
    #@setting = User.find(params[:user_id]).setting#.update(setting_params) 
    @setting = User.find(current_user).setting 
    respond_to do |format| 
    if @setting.update(setting_params) 
     format.html { redirect_to user_setting_path, notice: 'Setting was successfully updated.' } 
     format.json { render :show, status: :ok, location: user_setting_path } 
    else 
     format.html { render :edit } 
     format.json { render json: @setting.errors, status: :unprocessable_entity } 
    end 
    end 
end 
0

이 시도 :

#config/routes.rb 
resources :users do 
    resources :settings #-> domain.com/users/:user_id/settings/new 
end 

#app/models/setting.rb 
class Setting < ActiveRecord::Base 
    belongs_to :user 
end 

#app/models/user.rb 
class User < ActiveRecord::Base 
    has_many :settings 
end 

#app/controllers/settings_controller.rb 
class SettingsController < ApplicationController 
    def new 
    @setting = current_user.settings.new 
    end 

    def create 
    @setting = current_user.settings.new setting_params 
    @setting.save 
    end 

    private 

    def setting_params 
     params.require(:setting).permit(:region, :publish_to, :language) 
    end 
end 

이 당신에게 다음과 같은보기를 생성 할 수있는 기능 제공합니다 :

#app/views/settings/new.html.erb 
<%= form_for [current_user, @setting] do |f| %> 
    <%= f.text_field :region %> 
    <%= f.text_field :publish_to %> 
    <%= f.text_field :language %> 
    <%= f.submit %> 
<% end %> 

중첩

중첩 모델/데이터가 다소 까다 롭습니다 Rails에서, 당신이해야하는 방식 때문에 주로 필요한 데이터를 앱으로 전송할 수 있습니다.

가장 일반적으로 accepts_nested_attributes_for 사용하면을 통해 작업중인 하나 (당신이 User을 만들려는 경우 IE와 Setting), 당신은 할 수있을 것를 기록 를 생성 할 경우에만 정말 유효 그것을 사용하십시오 (다른 시간에 자세히 할 수 있습니다)

나는 내가 당신에게 필요한 결과를 줄 것이라고 권장하는 방법을 믿습니다. 나는거야

+0

의견을 주셔서 감사합니다. 당신이 여기서 쓴 것은 근본적으로 제가 이미 이전에 일했던 것입니다. 그럼에도 불구하고 까다로운 부분은 설정이 설정을 나타내는 속성을 포함하는 단일 객체라는 것입니다. 하지만 사용자는 하나의 설정 (개체) 만 가질 수 있습니다. 어떻게 이뤄지나요? – bnassler

+0

오, 그래! Rails가 단일 리소스를 라우팅하는 것을 가장 잘 볼 수 있습니다. - http://guides.rubyonrails.org/routing.html#singular-resources –

1

@setting = User.find(params[:user_id]).settings.new(setting_params) 

이이 설정됩니다 것입니다 당신이 다음 :user_id을 불리는 경우이

@setting = User.find(params[:id]).settings.new(setting_params) 

에 조치를 만들 변경해야 그렇다면 당신은 params[:id]가 있다고 가정 foreign_key가 새로 생성 된 설정에서 자동으로 생성됩니다.

+0

네스트 된 리소스이기 때문에 반드시 : : user_id가 될까요? –

+0

덕분에 해결책을 찾을 수있었습니다. 감사합니다 !! :-) – bnassler

관련 문제