1

一見すると、この質問は以前に回答されているように見えますが、私の場合はそうではありません (ほとんどは、大量割り当ての問題および/またはモンゴイドに関連しています)。 .

したがって、基本的には、Ruby on Rails アプリケーションでのユーザー認証に devise gem を使用しており、ネストされたアドレス モデルをユーザー モデルに追加したいと考えています。また、simple_form を使用してフォーム ビューを生成しています。

私はユーザーモデルを持っています:

class User < ActiveRecord::Base
  has_and_belongs_to_many :roles
  has_one :address

  accepts_nested_attributes_for :address, :allow_destroy => true
end

これはアドレス モデルです。

class Address < ActiveRecord::Base
  belongs_to :country
  belongs_to :state
  belongs_to :user

  attr_accessible :street1, :street2, :country_id, :state_id, :city, :postalCode
end

これは、ユーザー プロファイルを表示するための show アクションを追加するためにオーバーライドした Users コントローラーです。

class Users::RegistrationsController < Devise::RegistrationsController
  def new
    resource = build_resource({})
    resource.build_address
    respond_with resource
  end

  # POST /resource
  def create
    resource = build_resource(params[:user])

    if resource.save
      if resource.active_for_authentication?
        set_flash_message :notice, :signed_up if is_navigational_format?
        sign_up(resource_name, resource)
        respond_with resource, :location => after_sign_up_path_for(resource)
      else
        set_flash_message :notice, :"signed_up_but_#{resource.inactive_message}" if is_navigational_format?
        expire_session_data_after_sign_in!
        respond_with resource, :location => after_inactive_sign_up_path_for(resource)
      end
    else
      clean_up_passwords resource
      respond_with resource
    end
  end

  def show
    @user = User.find(params[:id])

    #Add to view count if not viewing own user profile
    if @user != current_user
      @user.views += 1
      @user.save  
    end

    @vehicles = Vehicle.where(:user_id => @user)

    respond_to do |format|
      format.html # show.html.erb
      format.json { render json: @user }
    end
  end
end

これは、新しいユーザーを作成するためのビューです。

<%= simple_form_for(resource, :as => resource_name, :url => registration_path(resource_name) ) do |f| %>

              <fieldset>
                    <%= f.input :username, :required => false, :autofocus => true, placeholder: 'Pick a username' %>
                    <%= f.input :email, :required => false, placeholder: 'Your email' %>
                    <%= f.input :password, :required => false, placeholder: 'Create a password' %>
                    <%= f.input :password_confirmation, :required => false, placeholder: 'Confirm your password' %>
                    <%= f.association :roles, :as => :check_boxes, :label => "", :required => false %>
                    <%= f.simple_fields_for :address do |a| %>
                        <%= a.input :street1 %>
                        <%= a.input :street2 %>
                        <%= a.association :country %>
                        <%= a.association :state %>
                        <%= a.input :city %>
                        <%= a.input :postalCode %>
                    <% end %>
                    <%= f.button :submit, 'Sign up for free', :class => 'btn btn-success btn-large' %>
              </fieldset>
<% end %>

したがって、新しいユーザーを作成する際のエラーは次のとおりです。アドレス ユーザーを空白にすることはできません

基本的に外部キー user_id はアドレスに設定されていません。

誰かがこの問題に少し光を当てることができることを望んでいました.

4

2 に答える 2

0

アプリケーションでこれを解決できましたが、強力なパラメーターを使用しています。ただし、解決策はあなたの場合にも適用できるはずです。

のすべてのメソッドをオーバーライドする代わりに、必要な正しいパラメーターを渡すようRegistrationsControllerにオーバーライドしました。build_resource

def build_resource(params)
  super(resource_params)
end

def resource_params
  params.require(:user).permit(:email, :password, tickets_attributes: [ :description ] )
end

私はまた、このようinverse_ofに私のモデルUserTicketモデルを持っています:

user.rb
  has_many :tickets, inverse_of: :user

ticket.rb
  belongs_to :user, inverse_of :tickets
于 2013-09-05T14:11:11.240 に答える