2013-01-25 20 views
0

我有許多用戶有一個狀態。出於某種原因,我無法使用狀態控制器中的創建操作來保存狀態。我認爲問題涉及到有一個協會,因爲我是新手,但我可能很容易犯錯。有一個關聯 - 控制器創建方法

這是現在的工作代碼。

用戶模型:

has_one :status, dependent: :destroy 

狀態型號:

attr_accessible :content 
belongs_to :user 
validates :user_id, presence: true 
validates :content, presence: true, length: { maximum: 250 } 

狀態控制器:

def create 
@new_status = current_user.build_status(param[:status]) 
    if @new_status.save 
    flash[:success] = "Status posted!" 
    redirect_to :back 
    else 
    flash[:error] = "Status couldn't save" 
    redirect_to :back 
    end 
end 

用戶控制器:

def show 
    @user = User.find(params[:id]) 
    @status = @user.status 
    @new_status = current_user.build_status 
end 

用戶/顯示:

<%= render 'shared/status_form' if @user == current_user %> 

共享/ Status_form:

<%= form_for[@new_status], :url => user_status_path(current_user) do |f| %> 
    <%= render 'shared/error_messages', object: f.object %> 
    <div class="field"> 
    <%= f.text_area :content, id:"status_box", placeholder: "Status?" %> 
    </div> 
    <%= f.submit "Update", id:"status_btn", class: "btn btn-small btn-primary" %> 
<% end %> 

路線:

resources :users do 
    resource :status, only: [:create, :destroy] 
end 

我知道這是很多來看待,但我很欣賞的幫助,謝謝。

回答

0

缺少的PARAMS要設置

@new_status = current_user.build_status(PARAMS [:狀態])

0

你不應該調用status而不是build_status嗎?

@status = current_user.status

,因爲這關係名稱領域

HAS_ONE:狀態

+0

當我這樣做,我奇怪地得到了一個未定義的方法 「拯救」,從行,如果@ status.save因爲在這種情況下沒有什麼可以保存的? current_user.status將是空的不是嗎? – Jaqx

1

我可以看到你的代碼的幾個問題。

  1. 您正在交換@usercurrent_user。這是有原因的嗎?您正在爲通過params [:id]檢索到的用戶生成狀態表單,但在您的StatusController中的create方法中,您始終嘗試創建當前用戶的狀態。這兩個用戶不一樣。
  2. create方法中,您嘗試保存新建的狀態實例,該實例除用戶關聯外爲空。這應該導致對content的驗證錯誤。

嘗試這樣(沒有測試過,但應該給你一個良好的開端):

的routes.rb:

resources :users do 
    resource :status, only: [:create, :destroy] 
end 

狀態/ _form.html。ERB:

<%= form_for [@user, @status] do |f| %> 
    <%= render 'shared/error_messages', object: f.object %> 
    <div class="field"> 
    <%= f.text_area :content, id:"status_box", placeholder: "Status?" %> 
    </div> 
    <%= f.submit "Update", id:"status_btn", class: "btn btn-small btn-primary" %> 
<% end %> 

StatusesController:

def create 
    @status = Status.new(params[:status]) 
    if @status.save 
    flash[:success] = "Status updated!" 
    redirect_to :back 
    else 
    flash[:error] = "Status didn't save" 
    redirect_to :back 
    end 
end 

讓我知道如果你有任何問題,這樣我們就可以制定出一個解決方案。另一件事是你可能會考慮創建一個狀態關聯和一個用戶實例(也就是說,如果用戶總是應該有一個狀態)。這樣,您始終可以參考@user.status而不是在控制器方法中構建一個。

+0

我正在研究這個,但還沒有到任何地方呢。我想我需要:form_for中的url部分,否則它試圖發佈到狀態而不是狀態。 nvm你還沒有看到更新的代碼呢 – Jaqx

+0

嗯,我認爲他們應該已經解決了這個問題。這裏有一個類似的線程http://stackoverflow.com/questions/2261827/nested-form-for-singular-resource 2年前回來...如果不是,那麼是的,試着明確地給它一個'user_status_path(@user ,@status)'作爲一個URL。 – HargrimmTheBleak

+0

我交換它們的原因是因爲當你在用戶配置文件中時,我需要使用@user來顯示該用戶。但是,當我想創建一個狀態時,只有當前登錄的用戶可以爲自己創建狀態 – Jaqx

相關問題