2017-10-10 7 views
1

私は3つのモデルを持っています。サーバは多くのメンテナンスを持ち、メンテナンスはサーバとユーザに属します。コンソールでRailsの強力なパラメータ - 外部キーパラメータを使用してアクションを作成

create_table :maintenances do |t| 
    t.references :server, foreign_key: true 
    t.references :user, foreign_key: true 
    t.string :name 
    t.text :content 
end 

次のように私はレコードを作成することができます

Server.create(:hostname => "Sissy", :description => "Webserver") 
Maintenance.create(:server_id => 1, :user_id => 1, :name => "Test", :content => "Test") 

を、私の質問は:私は私のコントローラでこれを行うことができますどのようにアクションを作成しますか? 問題:user_idは、メンテナンスのparamsハッシュの一部ではないということですので、私は

def create 
    @server = Server.find(params[:id]) 
    @maintenance = @server.maintenances.create!(maintenance_params) 
end 

    private 
    def maintenance_params 
     params.require(:maintenance).permit(:user_id => current_user.id, 
              :id, 
              :name, 
              :content)  
    end 

を書く場合、私ははい、あなたはstrong_params方法でそのような何かを行うことはできません

Syntax error, unexpected ',', expecting => 
...ser_id => current_user.id, :id, :name, :content, :start, :pl... 
...        ^): 

app/controllers/maintenances_controller.rb:41: syntax error, unexpected ',', expecting => 
+0

構文エラーは、rubyのメソッド呼び出しで序数引数の前にハッシュキーを持つことができないためです。 'permit(:id、:name、:content、:user_id => current_user.id)'は構文的に有効ですが、代わりにブロックを使用してセッションから値を入力パラメータにマージするのではなく、 – max

答えて

0

を取得しています。それはその目的でもありません。ホワイトリストとデフォルトのパラメータを区切ります。

私は通常、このようにそれを実行します。

def create 
    @server  = Server.find(params[:id]) 
    @maintenance = @server.maintenances.create!(maintenance_params.merge(user_id: current_user.id)) 
end 

private 
def maintenance_params 
    params.require(:maintenance).permit(:id, :name, :content) 
end 
3

あなたが追加することができ、あなたの作成、アクション自体の内部USER_ID。これを試して。

def create 
    @server = Server.find(params[:id]) 
    params[:maintenance][:user_id] = current_user.id 
    @maintenance = @server.maintenances.create!(maintenance_params) 
end 
+0

レコードが保存されていますが、user_idは空です。 (私はネストされたパラメータを持っていないか、私のモデルに書かれているようなものです) –

2

良い方法はcreate!メソッドにブロックを渡すことである。

@maintenance = @server.maintenances.create!(maintenance_params) do |m| 
    m.user = current_user 
end 

レコードは、(それが検証される前に/保存)ブロックを得ています。

new,create,updateおよびupdate!と同様に動作します。

しかし、いずれかの検証が失敗した場合、ActiveRecord::RecordNotValidエラーが発生するので、ここでbangメソッドcreate!を使用する必要があるかどうかを検討する必要があります。

def create 
    @server = Server.find(params[:id]) 
    @maintenance = @server.maintenances.new(maintenance_params) do |m| 
    m.user = current_user 
    end 
    if @maintenance.save 
    redirect_to @maintenance 
    else 
    render :new 
    end 
end 

のActiveRecord ::永続バン方法はだけは本当にシードファイルまたは場所の検証を渡していないレコードが例外イベントであるようなものに使用されるべきです。

関連する問題