2011-09-16 100 views
0

我有一個問題,讓我的第一個應用程序(我是一個總新手)保存一個新的相關記錄。我有兩個模型(用戶和圖片)has_many/belongs_to關聯。我已經設置了UserController中,以便它可以創建如下一個新的畫面:通過'has_many'更新數據庫'update_attributes'

def new_picture 
    @user = User.find(current_user.id) 
    @picture = @user.pictures.build 
    end 

    def create_picture 
    @user = User.find(params[:id]) 
    @picture = @user.pictures.build(params[:picture]) 
    if @picture.save 
     flash[:notice] = "Your picture was successfully added." 
     redirect_to :action => 'show', :id => @user.id 
    else 
     render :template => "new_picture" 
    end 
    end 

我用

<%= link_to("add picture", :action => 'new_picture', :id => @user.id) if current_user %> 

添加一個新的。但我也想能夠編輯。所以,我更新了UserController中有一些新的代碼:

def edit_picture 
    @user = User.find(current_user.id) 
    @picture = @user.pictures.find(params[:id]) 
    end 
    # When the user clicks the save button update record 

    def update_picture 
    @user = User.find(current_user.id) 
    @picture = @user.pictures.find(params[:picture]) 
    respond_to do |format| 
     if @picture.update_attributes(params[:picture]) 
     flash[:notice] = "Your picture was successfully updated." 
     redirect_to :action => 'show', :id => @user.id 
     else 
     render :template => "new_picture" 
     end 
    end 
    end 

,並添加編輯鏈接到show.erb:

<%= link_to("edit picture", :action => 'edit_picture', :id => picture.id) if current_user %> 

它加載編輯表單細末,用數據都在正確的地方,但保存所有它正在做的是從我的圖片表中給我錯誤'UsersController#update_picture'ArgumentError與一堆未知的密鑰(S)。

有人可以解釋爲什麼嗎?我覺得有一塊拼圖,我在這裏不太明白....

在此先感謝!

UPDATE:查看代碼如下:

<h1>New picture for <%= @user.name %></h1> 
<% form_for :picture, @picture, :html => { :multipart => true }, :url => {:action => 'update_picture', :id => @user.id} do |f| %> 
+0

Off-topic.For未來在查找參數時使用。而不是「@user = User.find(params [:id])」,使用這個「@user = User.find(:first,:conditions => [」id =?「,params [:id]])」 。這將有助於避免您收到的參數中不需要的字符。 – Hishalv

+0

對不起 - 這是題外話?如果可以,我可以編輯它 - 它應該在哪裏? –

+0

對不起,我的意思是我的評論沒有具體回答你的問題,我只是在你過濾參數時給出了一個建議。 – Hishalv

回答

0

我建議增加「accepts_nested_attributes_for:圖片到用戶模型,然後做

<%= form_for @user do |form| %> 
    .. user fields 

    <%= form.fields_for :pictures do |picture_form| %> 

    .. picture fields 

    <% end %> 

    <%= form.submit %> 
<% end %> 

在視圖中。

另一種選擇是爲圖片創建一個新的控制器。這可能更簡單。

1

似乎無法在視圖代碼中看到您的問題,但是您可以更優雅地(RESTful)執行與嵌套路由相同的操作。這樣你可能會更清楚地看到問題。

配置/ routes.rb中:

resources :users do 
    member do 
    resources :pictures 
    end 
end 

應用程序/控制器/ pictures_controller.rb:

class PicturesController < ApplicationController 
    before_filter :find_picture, :only => [:edit, :update] 

    def edit 
    end 

    def update 
    if @picture.update_attributes params[:picture] 
     flash[:notice] = "Your picture was successfully updated." 
     redirect_to user_path(current_user) 
    else 
     render :edit 
    end 
    end 

    protected 
    def find_picture 
    @picture = current_user.pictures.find params[:id] 
    end 
end 

應用/視圖/圖片/ edit.html.erb:

<%= form_for [current_user, @picture] do |f| %> 
<!-- some stuff --> 
<% end %> 

並鏈接到您的編輯表格:

<%= link_to_if current_user, 'edit picture', 
       edit_user_picture_path(:user => current_user, :id => picture) %> 
+0

嗯,它告訴我edit_user_picture_path是一個未定義的方法,當我加載顯示頁面?這是腳手架的問題嗎? –

+0

檢查路徑助手應該使用'rake routes'。 – jimworm

+0

不應該成爲一個問題......你把路線放進去了嗎? – jimworm