2016-03-29 11 views
5

Rails to Phoenix'e taşınıyorum ve cevabı bulamadığım bir soruna yanıt veriyorum.Geçerli Kullanıcı Bilgilerini Phoenix Framework'teki Bir İletiye Ekleme

Kullanıcı kimlik doğrulaması ayarlamam var (özel kimlik denetimi işlevinde @current_user öğesini işaretleyerek).

Ayrıca bir Post model/denetleyici/görünüm (tanıdık w Raylar için iskele) var.

otomatik olarak form kullanıcı doldurmak zorunda olduğu bir form alanına olmadan (her mesaj bir kullanıcıya ait olacaktır) gönderildiğinde @current_user kimliğine sahip Gönder alanını doldurmak istiyorum

.

yılında

@post.user = current_user.id 

nasıl Phoenix Çerçeve/İksiri ile bunu yapıyorsunuz: ... Bu oldukça basit raylar böyle bir şey çalışır sonrası kumandanın oluşturmak eylem eklendi? Benim PostController

def create(conn, %{"post" => post_params}) do 
    changeset = Post.changeset(%Post{}, post_params) 

    case Repo.insert(changeset) do 
     {:ok, _project} -> 
     conn 
     |> put_flash(:info, "Please check your email inbox.") 
     |> redirect(to: page_path(conn, :thanks)) 
     {:error, changeset} -> 
     render(conn, "new.html", changeset: changeset) 
    end 
    end 

oluşturmak eylem mantığı bu tip kontrolörü veya modele uygulanmalı İşte

? veya görünümde bunu yapmak için iyi bir yol var mı (güvenli olmayan bir gizli alan kullanmadan).

Çözüm (Gazler sayesinde):

def create(conn, %{"post" => post_params}) do 
    current_user = conn.assigns.current_user 
    changeset = Post.changeset(%Post{user_id = current_user.id}, post_params) 
    case Repo.insert(changeset) do 
     {:ok, _project} -> 
     conn 
     |> put_flash(:info, "Please check your email inbox.") 
     |> redirect(to: page_path(conn, :thanks)) 
     {:error, changeset} -> 
     render(conn, "new.html", changeset: changeset) 
    end 
    end 

cevap

10

Aşağıdaki kullanabilirsiniz:

current_user = conn.assigns.current_user 
changeset = Post.changeset(%Post{user_id: current_user.id}, post_params) 

Veya kullanmak Ecto.build_assoc/3: Bu içinde current_user var varsayar

current_user = conn.assigns.current_user 
changeset = Ecto.build_assoc(current_user, :posts, post_params) 

senin conn.assigns.

+0

Teşekkürler Gazler. Sorumu düzenledim - conn.assigns.current_user (ve çalışır) için kontrol eden özel bir işlev var; ancak, undefined function current_user diyerek bir hata alıyorum. Current_user öğesinin conn.assigns adresimde olduğundan nasıl emin olurum? –

+0

"current_user = conn.assigns.current_user" öğesini unuttuğunuz gibi görünüyor (ki sadece ilk örnekte gösterdim. Bunu da içerecek şekilde 2. sayfayı güncelledim). Eğer 'conn.assigns.current_user' çağırmak istemiyorsanız, https://hexdocs.pm/phoenix/Phoenix.Controller.html – Gazler

+0

'un 'overriding: action' bölümüne göz atmak isteyebilirsiniz. Evet yaptım. Mantıklı. Yardım ettiğin için teşekkür ederim! –

İlgili konular