2016-12-07 4 views
2

У меня есть действие index:Как я могу перенаправить на объект в массиве

def index 
    if params['type'] == 'random' 
    @objects = Object.order("RANDOM()").limit(1) 
    else 
    @objects = Object.all.limit(1) 
    end 
end 

и create действие:

def create 
    object = Object.find(params[:object_id]) 
    comment = object.comments.create(params[:comment].permit(:body)) 

    respond_to do |format| 
    format.html 
    format.js #ajax 
    end 

    if comment.save 
    redirect_to root_path(params[:object_id]) #doesn't work 
    else 
    flash[:error] = comment.errors.full_messages[0] 
    redirect_to root_path(params[:object_id]) #doesn't work 
    end 
end 

Я могу прокомментировать объект в моей index странице. Когда я помещаю комментарий, я хочу перенаправить на объект, который был прокомментирован.

С моим кодом страница перезагружается, но отображается следующий объект, и я не вижу комментария. Как я могу перенаправить на тот же объект?

Мои root_path

<span class="random-icon"><%= link_to icon('random'), "http://localhost:3000/?type=random" %></span> 

<div class="inner-container"> 
    <% @objects.each do |object| %> 
     <h1 class="title"><%= object.title %></h1> 
     <p class="obj"><%= object.body %></p> 
     <h3 class="comments-title">Comments:</h3> 
     <div id="comments"> 
     <% object.comments.each do |comment| %> 
      <div class="comments"> <%= comment.body %> 
      <span class="time-to-now"><%= distance_of_time_in_words_to_now(comment.created_at) %> ago</span> 
      </div> 
     <% end %> 
     </div> 

     <div id="error"><%= flash[:error] %></div> 
     <%= form_for([object, object.comments.build], remote: true) do |f| %> 
      <%= f.text_area :body, class: "text-area" %> 
      <p class="char-limit">255 characters limit</p> 
      <%= f.submit "Comment", class: 'button' %> 
     <% end %> 
    <% end %> 
</div> 
+0

Что находится в 'root_path'? Можете ли вы показать код? – RSB

+0

Я не думаю, что здесь 'root_path' получает какие-либо параметры. У вас есть какой-либо путь, например 'show_object', который получает параметр' object_id' в качестве параметра? – 31piy

+0

Нет, мне нужно делать только на индексной странице, я не могу использовать страницу показа. –

ответ

0

Если params['type'] правда, Object.order("RANDOM()").limit(1) всегда бр перепроверены и обычно возвращают новый объект. Для того, чтобы гарантировать, что Вы возвращаетесь к тому же объекту, вы можете хранить его в сессии, а затем проверить первый в индексе, если есть понравился комментарий в вашей сессии, если да, то @objects = Object.find(session[:comment_object_id])

def index 
    if session[:comment_object_id] 
    @objects = Object.find(session[:comment_object_id]) 
    session.delete(:comment_object_id) # delete the session after use 
    elsif params['type'] == 'random' 
    @objects = Object.order("RANDOM()").limit(1) 
    else 
    @objects = Object.all.limit(1) 
    end 
end 


def create 
    object = Object.find(params[:id]) 
    comment = object.comments.create(params[:comment].permit(:body)) 

    respond_to do |format| 
    format.html 
    format.js #ajax 
    end 

    if comment.save 
    session[:comment_object_id] = :object_id # set the session here 
    redirect_to root_path # should work now 
    else 
    flash[:error] = comment.errors.full_messages[0] 
    redirect_to root_path #should work now 
    end 
end 
+0

return this error: Не удалось найти Object с 'id' = object_id в этой строке: @objects = Object.find (session [: comment_object_id]) –

+0

Вы уверены, что использовали ': comment_object_id', чтобы установить сеанс в своем создании действие? – mokayode

+0

Я думаю, я знаю, где проблема, я бы отредактировал действие create. Вам нужно просто 'id', а не' object_id'. – mokayode

0

Это довольно легко, и ты очень близко.

Внутри вашего метода create у вас есть object, к которому вы хотите перенаправить. Так что просто использовать его непосредственно внутри if comment.save как:

redirect_to object_path(object)

Вы можете получить список всех этих path «помощников» с помощью команды:

rake routes

И в этом списке, вы должен видеть, кстати, что root_path не принимает никаких аргументов ... для дальнейшего использования.

Смежные вопросы