Приложение для голосования в рельсах 3: как мне установить связь с методом голосования? - PullRequest
0 голосов
/ 16 апреля 2011

Чтобы научить себя Rails, я создаю чрезвычайно простое приложение для голосования.

Есть 2 модели, Вопрос и Опция. Вопрос имеет множество параметров и вариант принадлежит Вопросу.

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

Теперь я хотел бы добавить код, который увеличивает значение option.count на единицу при нажатии на ссылку. У меня есть метод voice_up в модели Option:

class Option < ActiveRecord::Base
  validates :text, :presence => :true
  belongs_to :question

  def vote_up
    self.count += 1
  end
end

Контроллер My Options выглядит так:

class OptionsController < ApplicationController
  def create
    @question = Question.find(params[:question_id])
    @option = @question.options.create(params[:option])
    redirect_to question_path(@question)
  end

end

Модель моего вопроса выглядит так:

class Question < ActiveRecord::Base
  validates :text, :presence => {:message => 'A question normally has text...'}
  has_many :options, :dependent => :destroy


  def vote
    # Maybe the vote code will go here???
  end
end

А у моего контроллера вопросов есть обычные методы создания, создания, редактирования и уничтожения, которые создает скаффолд. V немного настройки здесь.

Мое представление show.html.erb, куда я хотел бы поместить ссылку на метод голосования, выглядит следующим образом:

  <p id="notice"><%= notice %></p>
    <p>
      <b>Question <%= @question.guid %></b>:
      <%= @question.text %>
    </p>
    <% if @question.options.count == 0 %>
        <p>Shame! there are currently no options to vote on. Add some! </p>
    <% elsif @question.options.count == 1 %>
        <p>One option in a vote is a dictatorship... Maybe add some more?</p>
    <% end %>
    <h2>Options:</h2>
    <% @question.options.each do |option| %>
      <p>
        <%= option.text %>:  ** Link to vote here!
      </p>
    <% end %>

    <h2>Add an option to vote on</h2>
    <%= form_for([@question, @question.options.build]) do |f| %>
      <div class="field">
        <%= f.label :text %><br />
        <%= f.text_field :text %>
      </div>
      <div class="actions">
        <%= f.submit %>
      </div>
    <% end %>

    <% if @question.options.count == 0 # Only show edit if no options saved. %> 
        <%= link_to 'Edit', edit_question_path(@question) %> |
    <% end %>
    <%= link_to 'Back', questions_path %>

Итак, я пытаюсь добавить ссылку «голосовать» рядом с каждой опцией, которая вызывает метод voice_up в модели опций. Это, наверное, смешно легко, но я врезался в стену и был бы очень признателен за любую помощь.

Кроме того, любые предложения о том, как сделать это лучше, будут приветствоваться!

Спасибо

Simon

Ответы [ 2 ]

1 голос
/ 16 апреля 2011

Я думаю, что @ oded-harth показал правильный путь, но у меня есть два замечания:

Прежде всего, Rails - прекрасный язык, и он написан для упрощения жизни наших разработчиков;) При программировании на Rails вы никогда не должны об этом забывать. Имея это в виду, я хочу указать вам «increment ()» метод . Таким образом, вы можете просто проголосовать без лишних += 1. Чтобы понизить голосование, используйте decrement(). Я считаю, что вы можете использовать это так: option.increment(:count)

Во-вторых, я думаю, это немного грязно иметь целые form для простого голосования. Вы можете использовать что-то вроде этого

<%= link_to "Vote Up", :url => { :action => :vote_up, :option_id => option.id }, :method => :put %>

Чтобы это работало, вам нужно настроить маршрут примерно так:

resources :votes
  put :vote_up
end
0 голосов
/ 16 апреля 2011

Что я хотел бы сделать, это сделать метод voice_up в контроллере:

def vote_up 

option = Option.find(params[:option_id])
option.count += 1

redirect (to where do you want...)

end

И в представлении я бы назвал этот метод следующим образом:

<%= form_for( option, :url => { :action => "vote_up", :option_id => option.id} ) do |f| %>
<%= f.submit("vote up") %>  
<% end %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...