0

フォームを含むパーシャルがあります:

<% form_for :message, :url => { :action => "create" }, :html => { :id => 'form' } do |f| %>
  <%= f.error_messages %>

  <%= f.label :title, "title" %>
  <%= f.text_field :title %>

  <%= f.label :tag, "tag" %>
  <% if controller.controller_name == "tags" %>
    <%= f.text_field :tag_list, :value => @title %>
  <% else %>
    <%= f.text_field :tag_list %>
  <% end %>

  <%= f.label :name, "name" %>
  <%= f.text_field :name %>

  <%= f.label :email, "email" %>
  <%= f.text_field :email %>

  <%= f.label :title, "message" %>
  <%= f.text_area :content %>

  <%= f.submit 'submit' %>

<% end %>

メッセージとタグの 2 つのコントローラーでこれを使用しています。メッセージコントローラーでは正常に機能しますが、タグコントローラーでは機能しません。tags#show でレンダリングされると、タグ フィールドが自動入力されます。tags#show からメッセージが送信されると、Web サイトのルートにリダイレクトされ、「タグが存在しません」というフラッシュ エラーが表示されます。

タグ コントローラー:

class TagsController < ApplicationController
  before_filter :redirect_if_doesnt_exist#, :only => :show

  def show
    @title = Tag.find(params[:id]).name
    @tag = Tag.find(params[:id])
    @entries = Entry.paginate(Entry.find_tagged_with(@tag), 
            :page => params[:page], :per_page => 10, :order => "name")
    @messages = Message.paginate(Message.find_tagged_with(@tag), 
            :page => params[:page], :per_page => 10, :order => "updated_at DESC")
    @related_entries = Entry.tagged_with(@tag, :on => :tags)
    @related_tags = @related_entries.collect{|x|x.tags}.flatten.uniq
    @related_tags.delete(@tag)
  end

  private
  # Redirect if requested tag does not exist
  def redirect_if_doesnt_exist
    @tag = Tag.find(params[:id]) rescue nil
    if @tag.nil? # maybe "or @tag.empty?" could solve the empty tag issue
      flash[:error] = 'Tag does not exist.'
      redirect_to '/'
    end
  end
end

明確でない場合: パーシャルがビューに表示され、その中のフォームはタグ コントローラーからデータを送信せず、リダイレクトされます。パーシャルは、メッセージ コントローラーから正常に動作します。これは Rails 2.3.x アプリケーションです。私の質問を読んでいただきありがとうございます。お時間をいただきありがとうございます。

4

1 に答える 1

1

あなたの問題は、フォームの部分的な URL がアクションのみであることです。

<% form_for :message, :url => { :action => "create" }, :html => { :id => 'form' } do |f| %>

の下にないビューにこれを含めるmessages_controllerと、間違ったアクションが呼び出されます。これをタグビューに含めると、代わりにcreateアクションを呼び出そうとしますtags_controller

コントローラーも追加するだけでおそらくうまくいくでしょう:

<% form_for :message, :url => { :controller => :messages, :action => :create }, :html => { :id => 'form' } do |f| %>
于 2010-07-29T18:52:24.150 に答える