В Rails, как вы вызываете конкретный метод в контроллере из формы в представлении? - PullRequest
2 голосов
/ 24 июля 2011

плохо знакомы с рельсами, так что терпите меня.То, что я хотел бы сделать, это у меня есть список сообщений на экране.Я хочу, чтобы сообщение было помечено как «закрытое», что означает, что оно просто заполняет полную дату.

У меня есть модель:

class Message < ActiveRecord::Base
  attr_accessible :topic, :body, :completeDate, :created_at
  belongs_to :account
  belongs_to :user
  has_many :message_followups
end

У меня есть контроллер:

class MessagesController < ApplicationController
def close
   @message = Message.find(params[:messageId])
   @message.completeDate = Date.today
   if @message.save
    redirect_to myHomeMessages_path, :flash => { :success => "Your message was closed." }
   else
    redirect_to myHomeMessages_path, :flash => { :error => "Error closing message." }
   end
end
end

У меня есть представление:

<%= form_for (???) do |f| %>
    Are you sure you wish to close this message?<br>
    <%= hidden_field_tag 'messageId', message.id.to_s %>
    <%= submit_tag "Close Message" %>
<% end %>

У меня проблема с выяснением, как получить form_for или form_tag для вызова конкретного метода close в контроллере сообщений.Любая помощь будет принята с благодарностью, спасибо.

Мэтт

Ответы [ 3 ]

6 голосов
/ 24 июля 2011

Очень важный совет, вы не должны использовать регистр верблюдов для имен переменных в Ruby, методы переменных песка должны использовать подчеркивание в качестве разделителей, если вы используете другой язык, такой как Java, старайтесь избегать использованияте же шаблоны именования, которые вы использовали там.Случай с верблюдом в ruby ​​предназначен только для имен классов и модулей.

Я предполагаю, что вы используете Ruby on Rails 3, поскольку вы еще не сказали, что используете.Во-первых, вам нужен маршрут для этого, он будет выглядеть следующим образом в вашем файле rout.rb:

resources :messages do
    member do 
        post 'close'
    end
end

Небольшое изменение в вашем контроллере

def close
   @message = Message.find(params[:id]) #you don't need to use the hidden field here
   @message.completeDate = Date.today
   if @message.save
    redirect_to myHomeMessages_path, :flash => { :success => "Your message was closed." }
   else
    redirect_to myHomeMessages_path, :flash => { :error => "Error closing message." }
   end
end

И ваша форма собираетсячтобы выглядеть так:

<%= form_for( @message, :url => close_message_path( @message ), :html => { :method => :post } ) do |f| %>
    Are you sure you wish to close this message?<br>
    <%= f.submit "Close Message" %>
<% end %>

Эта форма будет опубликована в "/ messages / ID_HERE / close", и Rails собирается установить значение "ID_HERE" в качестве параметра "id" по вашему запросу.

С полной документацией по форме можно ознакомиться здесь .

2 голосов
/ 24 июля 2011

Что-то вроде этого должно вывести вас из строя:

<%= form_for @message, :url => { :action => "close" }, :html => { :method => :put } do |f| %>

Это означает, что вы выполняете метод HTTP PUT для метода close в контроллере сообщений. Для получения дополнительной информации о вспомогательном методе form_for прочитайте здесь

0 голосов
/ 24 июля 2011

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

<%= form_for( @message ) do |f|
  <p>Are you sure you wish to close this message?</p>
  <%= hidden_field_tag :close %>
  <%= f.submit "Close Message" %>
<% end %>

Тогда в вашем контроллере:

class MessagesController < ApplicationController

  def update
    @message = Message.find(params[:id])
    @message.completeDate = Date.today if params.has_key?(:close)
    if @message.save
      redirect_to myHomeMessages_path,
        :flash => { :success => "Your message was closed." }
    else
       redirect_to myHomeMessages_path, 
         :flash => { :error => "Error closing message." }
    end
  end
end
...