3

いくつかの場所があり、人々はそれらの場所について投稿を書くことができます。ここまでで、テーブル locations(rails generate scaffold locations name:string)とテーブル postsを作成しました(rails generate scaffold posts title:string text:string author:string image:string location_id:integer)。したがって、テーブルpostsにはテーブルへの外部キーがありますlocations。そのため、テーブルの show アクションで投稿を表示できます。

/locations/1 のビュー (ロケーション モデルのアクションを表示) および /posts/new のビュー:

/locations/1 の表示 (場所モデルのアクションを表示)ここに画像の説明を入力

私が望むのは、特定の場所を訪れた人が、以下に示すように、id ボックスに入力する必要なく投稿を作成できることです。この投稿が現在の ID の場所に属していることを自動的に認識する必要があります。コントローラーで何を変更する必要があり、動作させるために html.erb ファイルで何をする必要がありますか? 私はすでにこれを試しました...しかし、noMethodエラーを取得します。

  def newpost
    @post = current_location.posts.build 

    respond_to do |format|
      format.html 
      format.json { render json: @locations }
    end
  end 

それで、チャールズとザインの指示に従いました。

class PostsController < ApplicationController
(...)
  def new
    #@post = Post.new
    @post = @location.posts.build

    respond_to do |format|
      format.html # new.html.erb
      format.json { render json: @post }
    end
  end
(...)
end

config/routes.rb

resources :locations do
  resources :posts
end

部分的な投稿

<%= form_for @post do |f| %>
  <%= f.label :title, 'Title' %>
  <%= f.text_field :title %>

  <%= f.label :title, 'Text' %>
  <%= f.text_field :text%>

  <%= f.label :title, 'Author' %>
  <%= f.text_field :author %>

  <%= f.hidden_field :location_id %>
  <%= f.submit "Submit" %>
<% end %>

まだエラーがあるようです:

NoMethodError in PostsController#new

詳細:

undefined method `posts' for nil:NilClass
app/controllers/posts_controller.rb:28:in `new'

Request
Parameters:
{"location_id"=>"1"}

Response
Headers:
None

2回目の試行:今、編集しましたPostsController

  def new
    #@post = Post.new
    @location = Location.find(params[:location_id]) # You can move this to a before_filter, if you prefer
    @post = @location.posts.build

    respond_to do |format|
      format.html # new.html.erb
      format.json { render json: @post }
    end
  end

コントローラーにエラーはもうないようです。-ファイルにいくつかありNoMethodErrorますhtml.erb

undefined method 'posts_path' for #<#<Class:0x2404384>:0x204ed98>

1: <%= form_for @post do |f| %>
2:     <%= f.label :title, 'Title' %>
3:     <%= f.text_field :title %>
4: 

app/views/posts/_form.html.erb:1:in `_app_views_posts__form_html_erb___1061496502_7409780'
app/views/posts/new.html.erb:3:in `_app_views_posts_new_html_erb__238125222_5750540'
app/controllers/posts_controller.rb:31:in `new'

私の_form.html.erb

<%= form_for @post do |f| %>
    <%= f.label :title, 'Title' %>
    <%= f.text_field :title %>

    <%= f.label :title, 'Text' %>
    <%= f.text_field :text%>

    <%= f.label :title, 'Author' %>
    <%= f.text_field :author %>

    <%= f.hidden_field :location_id, :value => @location.id %>
    <%= f.submit "Submit" %>
<% end %>

私のnew.html.erb

<h1>New post</h1>

<%= render 'form' %>

<%= link_to 'Back', posts_path %>

最後のコードを単純に削除しようとしまし<%= link_to 'Back', posts_path %>たが、すべてを保存してサーバーをシャットダウンし、再度開いてもエラーが返されます。しかし、問題は posts_path ではないと思います。<%= form_for @post do |f| %>html.erb ファイルの をに変更すると<%= form_for @location.post do |f| %>NoMethodError for 'post'

4

2 に答える 2

3

投稿を場所の下にネストされたリソースにしたいようです。

それがあなたがやろうとしていることである場合、config/routes.rbでは次のようにする必要があります。

resources :locations do
  resources :posts
end

id = 1 の場所の新しい投稿を作成するための URL は/locations/1/posts/newで、newアクションはPostsController次のようになります。

def new
  @location = Location.find(params[:location_id]) # You can move this to a before_filter, if you prefer
  @post = @location.posts.build

  respond_to do |format|
    format.html
    format.json { render json: @post }
  end
end

パーシャルapp/views/posts/_form.html.erbは次のようになります。

<%= form_for [@location, @post] do |f| %>
  <%= f.label :title, 'Title' %>
  <%= f.text_field :title %>

  <%= f.label :title, 'Text' %>
  <%= f.text_field :text%>

  <%= f.label :title, 'Author' %>
  <%= f.text_field :author %>

  <%= f.hidden_field :location_id %>
  <%= f.submit "Submit" %>
<% end %>

ネストされたリソースでは、ビューで使用するルート ヘルパーが異なることに注意してください。たとえばindex、特定の場所に属する投稿のアクションへ のパスを取得するにはlocation_posts_path(@location)、 ではなくを使用しますposts_path

于 2012-06-13T19:30:32.270 に答える
2

投稿を作成するフォームに、場所のIDを含む非表示フィールドを追加するだけです。

だから、このようなもの:

<%= form_for @post do |f| %>
    <%= f.label :title, 'Title' %>
    <%= f.text_field :title %>

    <%= f.label :title, 'Text' %>
    <%= f.text_field :text%>

    <%= f.label :title, 'Author' %>
    <%= f.text_field :author %>

    <%= f.hidden_field :location_id, :value => @location.id %>
    <%= f.submit "Submit" %>
<% end %>

@location表示している現在の場所を含むインスタンス変数はどこにありますか。

于 2012-06-13T15:04:00.287 に答える