2011-12-05 1 views
2

現在、ソーシャルネットワーキングサイト用のWebアプリケーションを開発中ですが、ネストされたリソースを正しく動作させることは不可能です。あなたが私を助けることができればそれはすばらしいことになり、私はとても感謝しています。Rails 3ネストされたリソース:動作するフォームやページを取得できません

ここに私のルートがあります。 mysite.com/username/photos/(新規、編集など)のようなURL構造を持っていたいと思います。 URL構造はそうですが、フォームやページにアクセスしようとするとエラーが発生します。私はこれまでに持っているものを投稿しました。

routes.rbを

resources :users do 
    resources :photos 
    end 

photo.rb

belongs_to :users 

user.rb

has_many :photos, :foreign_key => "id", :dependent => :destroy 

_form.html.erb このフォームにはクリップを使用した添付ファイルがあります。以前の<%の文がありましたが、ここでは以下のコード全体が表示されないため、削除しました。

form_for(@photos,@user) :html => {:multipart => true} do |f| %> 

photos_controller.rbこれが問題であるが、あなたのform_forタグが間違った形式であることを表示されていることを

def new 
    @photo = Photo.new(params[:photo]) 
end 

答えて

1

ユーザを取得するにはbefore_filterを作成し、新規作成するにはフォームの投稿を作成する必要があります。お使いのフォトコントローラは次のようになります:

before_filter :get_user 
... 

def new 
    @photo = @user.photos.build 
end 

def create 
    @photo = @user.photos.build(params[:photo]) 
    respond_to do |format| 
    if @photo.save 
     format.html {redirect_to [@user, @photo], notice: "Photo saved!"} 
    else 
     format.html {render action: "new"} 
    end 
    end 
end 
... 
private 
def get_user 
    @user = User.find(params[:user_id]) 
end 

ここで、before_filterはユーザを取得します。ネストされたルートでは、親リソースIDはparams[:parent_id]、またはこの場合はparams[:user_id]になります。次に、作成コントローラ内で、@user.photosコレクションから写真を作成します。これにより、写真とユーザーの間に自動的に参照が作成されます。

また、form_forには、後ろにリレーションがあります。それはform_for([@user, @photo]) ...でなければなりません。

+1

ありがとう、小さな誤りです。私はより慎重に自分のコードを見て開始する必要があります。それらを指摘してくれてありがとう! – coletrain

1

特定されていません。ユーザーを指定した後にform_forタグのかっこを閉じているため、:html部分を無視しています。

<%= form_for([@photos, @user], :html => {:multipart => true}) do |f| %> 

@photos@user配列として渡さなければなりません:私はこれをしようとするだろう。

また、@photosのparamが複数の理由もわかりません。それは[@photo, @user]ではありませんか?私はその部分で間違っているかもしれません。

0

入手したエラーはどこですか?

カップルの事: photo.rb中:users#newページから

belongs_to :user 

代わりusers

のあなたが作成しようとしている写真?もしそうなら、accepts_nested_attributes_for使い方を見てみてください:

has_many :photos, :dependent => :destroy 
accepts_nested_attributes_for :photo 

user.rbにそして、あなたのusers#newフォーム上:

<%= form_for @user, :html => {:multipart => true} do |f| %> 
    # ... user attributes ... 
    <%= f.fields_for :photo do |p| %> 
    <%= p.file_field :name %> 
    <% end %> 
<% end%> 

はまた、あなたのアップロードのためのペーパークリップの代わりに carrierwaveを使用することを検討してください。ここには railcastがあります。がんばろう。

+1

ありがとう!しばらく後にそれを考え出す。私は新しいモデルを組み込むためにコントローラーを更新しませんでした。また、あなたが投稿したビデオは、私にもう一度感謝してくれました! – coletrain

関連する問題