Ошибка маршрутизации Rails3 с ajax - PullRequest
1 голос
/ 08 ноября 2010

ОБНОВЛЕННЫЙ КОД в нижней части

Я создаю приложение для голосования по истории с помощью книги просто Rails 2.Я получаю эту ошибку, когда нажимаю кнопку, чтобы проголосовать за историю:

No route matches "/stories/4-pure-css-icons-showcase"

Мой файл маршрутизации выглядит следующим образом:

Shovell::Application.routes.draw do
  get "votes/create"

  root :to => "stories#index"
  resources :stories do
    resources :votes
  end
end

Vote_controller.rb:

class VotesController < ApplicationController
  def create
    @story = Story.find(params[:story_id])
    @story.votes.create
  end

end

create.rsj:

page.replace_html 'vote_score', "Score: #{@story.votes.size}"
page[:vote_score].visual_effect :highlight

show.html.erb:

<h2>
    <span id="vote_score">
        Score: <%= @story.votes.size %>
    </span>
    <%= @story.name %>
</h2>
<p>
    <%= link_to @story.link, @story.link %>
</p>
<div id="vote_form">
    <%= form_tag :url => story_votes_path(@story), :remote => true do %>
        <%= submit_tag 'shove it' %>
    <% end %>
</div>

story.rb:

class Story < ActiveRecord::Base
    validates_presence_of :name, :link
    has_many :votes
    def to_param
        "#{id}-#{name.gsub(/\W/, '-').downcase}"
    end
end

До этого я работал над множеством других ошибок, связанных с устаревшим кодом и т. Д., Поэтому в настоящий момент я чувствую себя несколько потерянным.Кажется, это просто проблема с маршрутизацией, но так как я работал с ошибками AJAX, которые также связаны с функцией голосования, я хотел опубликовать эти файлы на случай, если это будет больше, чем маршрутизация.

Он говорит, что ни один маршрут не соответствует "/stories/4-pure-css-icons-showcase", но когда я захожу на "/stories" (мой корень) и нажимаю на ссылку, чтобы перейти на "/stories/4-pure-css-icons-showcase", он работает нормально, однако после нажатия на кнопку голосования я получаю эту ошибку.Как вы, вероятно, могли бы сказать после прочтения кода, предполагается обновить счетчик голосов и выполнить :highlight через ajax.


ОБНОВЛЕНИЕ:

Измененный код (все изменения выполняются по совету Сэма):

маршруты:

Shovell::Application.routes.draw do
  resources :votes
  root :to => "stories#index"
  resources :stories do
    resources :votes
  end

show.html.erb:

<div id="vote_form">
    <%= form_tag :url => new_story_vote_path(@story), :remote => true do %>
        <%= submit_tag 'shove it' %>
    <% end %>
</div>

Vote_controller.rb

class VotesController < ApplicationController
  def create
    @story = Story.find(params[:story_id])
    @story.votes.create
    respond_to do |format|
        format.html
        format.js 
  end
end

Проблема все та же, но я думаю (читай: надеюсь), что мы делаем успехи!

Сценарий: Моя страница индекса (/stories) в случайном порядкеотображает историю из базы данных; когда вы нажимаете на ссылку, она ведет на внутреннюю страницу истории (например, /stories/2-sitepoint-forums) на этой странице, она отображает количество голосов, которые имеет история, и имеет кнопку, чтобы проголосовать за нее.Когда вы нажимаете кнопку голосования, предполагается использовать ajax для обновления @story.vote.size и использовать визуальный эффект :highlight.Однако проблема в том, что когда вы нажимаете кнопку голосования, страница превращается в страницу «Ошибка маршрутизации», которая отображает:

No route matches "/stories/2-sitepoint-forums"

Это странно для меня, потому что вы на самом деле можете бытьмаршрутизируется по этому адресу, и вы по ссылке на первой странице ...


Вот ошибка в консоли:

Started POST "/stories/2-sitepoint-forums?url=%2Fstories%2F2-sitepoint-forums%2F
votes%2F2-sitepoint-forums&remote=true" for 127.0.0.1 at 2010-11-08 16:30:17 -08
00

ActionController::RoutingError (No route matches "/stories/2-sitepoint-forums"):



Rendered C:/Ruby192/lib/ruby/gems/1.9.1/gems/actionpack-3.0.0.rc2/lib/action_dis
patch/middleware/templates/rescues/routing_error.erb within rescues/layout (1.0m
s)

ImЯ не уверен, если это что-то еще говорит, но я подумал, что добавлю это в случае.


Новый: Я пока не смог решить эту проблему.Поскольку я до сих пор не чувствую, что полностью понимаю проблему, я решил перейти к учебному пособию по Ruby on Rails 3 онлайн и посмотреть, не смогу ли я разобраться во время работы над ним.Так как я все равно планировал сделать это в следующий раз (у меня есть планы объединить оба приложения позже), похоже, сейчас самое время.

Ответы [ 3 ]

2 голосов
/ 08 ноября 2010
<%= form_tag :url => new_story_vote_path(@story), :remote => true do %>
    <%= submit_tag 'shove it' %>
<% end %>

Это должно отправить его в действие создания.

def create
  @story = Story.find(params[:story_id])
  @story.votes.create
  respond_to do |format|
      format.html
      format.js 
  end 
end

И это должно позаботиться о вашем аяксе.


убери это get "votes/create" из своих маршрутов

и добавьте это

map.resources :votes
0 голосов
/ 02 июня 2011

Я не уверен, что вы нашли ответ на свою проблему, но я хотел бы опубликовать для других, которые могут искать ответ, похожий на ваш.

Код:

<%= form_tag :url => new_story_vote_path(@story), :remote => true do %>
    <%= submit_tag 'shove it' %>
<% end %>

приведет к / story /: story_id / голосов / новый URL с запросом: post.Это не будет работать, потому что маршрут new является запросом метода: get.Если вы хотите перейти к методу new, вам нужно указать форме использовать метод get http.

<%= form_tag :url => new_story_vote_path(@story), :remote => true, :html => { :method => :get } do %>
    <%= submit_tag 'shove it' %>
<% end %>

Однако я думаю, что вы хотите направить на create метод в вашем контроллере.Я бы сделал что-то вроде:

<%= form_tag :url => story_votes_path(@story), :remote => true do %>
    <%= submit_tag 'shove it' %>
<% end %>

Это должно правильно маршрутизировать метод create в вашем VotesController.

0 голосов
/ 08 ноября 2010

Я не знаком с использованием form_tag и: remote (поскольку я обычно просто пишу jQuery для подобных вещей), но кое-что определенно всплывает во мне из-за того, что вы здесь делаете, что может помочь вам решить проблему .

Прежде всего, я думаю, что вы можете переделать способ, которым вы настроили голосование, и, таким образом, способ, которым вы создали форму для голосования. В контроллере историй для шоу-шоу я бы сразу назначил голосование:

@vote = Vote.new(:story_id => @story.id)

Это позволяет вам настроить форму следующим образом:

= form_for(@vote), :remote => true do |f|
    = hidden_field f.story_id
    = submit_tag "Vote"

По моему мнению, это более чистый способ ведения дел, но он также может решить общую проблему, с которой вы имеете дело, потому что вы сейчас передаете данные с формой (скрытое поле) в Ваш запрос POST. Rails будет работать неожиданно, если вы выполняете запросы AJAX POST, которые фактически не отправляют данные.

Другими словами, ваша исходная форма, скорее всего, работает как запрос AJAX POST, но она бы работала лучше, чем запрос AJAX GET, поскольку на самом деле это не отправка данных, а просто «обращение» по URL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...