2011-09-10 13 views
1

assiciatedレコードが特定のcreteriaを満たすレコードを検索します指定された場所から50マイル先の投稿。私は例を探しましたが、必要なものは見つけられませんでした。私は2つの方法で問題を解決しようとしましたが失敗しました。私はRailsの初心者で問題を数えていませんが、他のhas_oneモデルを使うと便利かもしれません。Railsの3 has_oneのモデルは、どのように私はモデルのポストを持って

は、私が試した:

posts_controller.rb

def index 
if params[:saddress].present? 
    @locations = Location.near(params[:saddress], 50, :order => :distance) 
    for location in @locations 
    @posts << location.post 
    end 
else 
    @posts = Post.all 
end 

index.html.erb

<h1>Events</h1> 
<fieldset> 
<legend>Find event</legend> 
<%= form_tag(posts_path, :method => "get") do %> 
    <%= label_tag(:saddress, "Address:") %> 
    <%= text_field_tag :saddress, params[:saddress] %> <br/> 
    <%= label_tag(:sactivity, "Activity type:") %> 
    <%= select_tag :sactivity, options_from_collection_for_select(Activity.all, "id", "name", params[:sactivity]) %> 
    <%= submit_tag "Поиск"%> 
<%end%> 
</fieldset> 
<%if @user%> 
    <%= link_to "Новое событие", new_post_path %> 
<%end%> 
<table> 
<tr> 
<th>Created</th> 
<th>Author</th>  
<th>Event</th> 
<th>Address</th> 
<th>Activity type</th> 
</tr> 
<% for post in @posts.sort.each %> 
    <%if post%> 
    <tr> 
    <td><%= post.created_at %></td> 
    <td><%= post.person.name %></td> 
    <td><%= link_to post.name, post %></td> 
    <td><%if post.location%><%= post.location.address %> <%end%></td> 
    <td><%= post.activity.name %></td> 
    </tr> 
    <%end%> 
<%end%> 
</table> 

それがエラーになった:あなたが持っている

NoMethodError PostsControllerの中#インデックスあなたがそれを期待していなかったときには無名のオブジェクトです! Arrayのインスタンスが想定されている可能性があります。 nilを評価中にエラーが発生しました。 < <

どうか間違ってください。たぶんこれのための他の簡単な方法があります。

はまた、私はposts_controller.rbでこれを試してみました:この場合

if params[:saddress].present? 
    @locations = Location.near(params[:saddress], 50, :order => :distance) 
    @posts = Post.find(:all, :include => [:location], :conditions => ["locations.id in ?", @locations]) 
else 
    @posts = Post.all 
end 

を私はSQLに問題がありました。

答えて

0

PostsController#indexメソッドでは、@posts変数を初期化する必要があります。アイテムを追加する前に配列にすることができます。もしあなたがそうしていれば@postsは暗黙のうちにあなたのエラーを説明するnilに初期化されます。あなたのコードは次のように変更します。上記のコードの

def index 
    if params[:saddress].present? 
    @posts = [] 
    @locations = Location.near(params[:saddress], 50, :order => :distance) 
    for location in @locations 
     @posts << location.post 
    end 
    else 
    @posts = Post.all 
    end 
end 

別の(短い)バリアントは

def index 
    if params[:saddress].present? 
    @locations = Location.near(params[:saddress], 50, :order => :distance) 
    @posts = @locations.collect(&:post) 
    # ^^ this is the short form of the following equivalent expression: 
    # @posts = @locations.collect{ |loc| loc.post } 
    else 
    @posts = Post.all 
    end 
end 
+0

あるU 4の答えをありがとうございました。私はあなたの例のように変更を加えましたが、私はまだ問題があります。しかし、全く異なる:投稿#指数の例外ArgumentErrorライン#23を上昇/home/mike/Blog/blog/app/views/posts/index.html.erbを表示 :ActiveRecordを持つNilClassの 比較::協会:: BelongsToAssociation失敗 –

+0

問題が解決しました。私は、すべての「場所」が「投稿」と関連しているわけではないという問題がありました。どうもありがとうございました。 –

関連する問題