簡體   English   中英

在“ form_for”中傳遞外部表

[英]Pass a foreign table in a “form_for”

我有兩種模式

user.rb

class User < ActiveRecord::Base
  devise :database_authenticatable, :registerable,
     :recoverable, :rememberable, :trackable, :validatable

  has_one :personal
  before_create :generate_profile
end

和personal.rb

class Personal < ActiveRecord::Base
   belongs_to :user
   validates :user_id, presence: true
end

在我的控制器中,我有:

def createinfo
    @user = current_user
    @personal = @user.personal
end 

我想這樣做的形式:

<%= form_for @personal do |f| %>
    Trigramme : <%= f.text_field :trigramme, :input_html => { :value => 'blabla' } %><br />
    Nom : <%= f.text_field :nom %><br />
    Prenom : <%= f.text_field :prenom %><br />
    Poste    : <%= f.text_field :poste %><br />
    Bio    : <%= f.text_area :bio %><br />
    <%= f.submit %>
<% end %>

但是我有一個錯誤,我不知道該如何解決。 我認為current_user.personal路徑不被form_for接受,盡管當我僅將current_user.personal.trigramme放入代碼中時,它會打印正確的內容。

undefined method `personal_path' for #<#<Class:0x8e15a28>:0x8e15308>

你知道我該怎么辦嗎?

編輯:我的route.rb

Rails.application.routes.draw do

  devise_for :users
  root 'static_pages#cvpage'
  get 'home'        => 'static_pages#home'
  get 'help'        => 'static_pages#help'
  get 'about'       => 'static_pages#about'
  get 'contact'     => 'static_pages#contact'
  get 'cvpage'      => 'static_pages#cvpage'
  get 'createinfo'  => 'static_pages#createinfo'
end

編輯2 schema.rb:

create_table "personals", force: :cascade do |t|
  t.string   "trigramme"
  t.string   "nom"
  t.string   "prenom"
  t.string   "poste"
  t.text     "bio"
  t.integer  "user_id"
  t.datetime "created_at", null: false
  t.datetime "updated_at", null: false
end

add_index "personals", ["user_id"], name: "index_personals_on_user_id"

create_table "users", force: :cascade do |t|
  t.string   "email",                  default: "", null: false
  t.string   "encrypted_password",     default: "", null: false
  t.string   "reset_password_token"
  t.datetime "reset_password_sent_at"
  t.datetime "remember_created_at"
  t.integer  "sign_in_count",          default: 0,  null: false
  t.datetime "current_sign_in_at"
  t.datetime "last_sign_in_at"
  t.string   "current_sign_in_ip"
  t.string   "last_sign_in_ip"
  t.datetime "created_at",                          null: false
  t.datetime "updated_at",                          null: false
end

耶! 我解決了我的問題(花了很多時間)

我把我的personal控制器放在這里:

def update
  @user = current_user
  @personal = @user.personal
  if @personal.update_attributes(personal_params)
    # if update is successful
  else
    # if update is unsuccessful
  end
  redirect_to home_path
end

def personal_params
  params.require(:personal).permit(:trigramme, :nom, :prenom, :poste, :bio)
end

我認為這種形式:

<%= form_for(@personal, html: { method: :put }) do |f| %>

Trigramme : <%= f.text_field :trigramme %><br />
Nom : <%= f.text_field :nom %><br />
Prenom : <%= f.text_field :prenom %><br />
Poste    : <%= f.text_field :poste %><br />
Bio    : <%= f.text_area :bio %><br />
<%= f.submit %>

謝謝大家!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM