いくつかの場所があり、人々はそれらの場所について投稿を書くことができます。ここまでで、テーブル 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 のビュー:
私が望むのは、特定の場所を訪れた人が、以下に示すように、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'