0

1 つのステータスを持つユーザーが多数います。何らかの理由で、ステータス コントローラの create アクションを使用して保存するステータスを取得できません。私はそれが初めてなので、問題は has one 関連付けに関係していると思いますが、簡単に間違っている可能性があります。

これは現在、動作するコードです。

ユーザー モデル:

 has_one :status, dependent: :destroy

ステータス モデル:

attr_accessible :content
belongs_to :user
validates :user_id, presence: true
validates :content, presence: true, length: { maximum: 250 }

ステータス コントローラ:

def create
@new_status = current_user.build_status(param[:status])
  if @new_status.save
    flash[:success] = "Status posted!"
    redirect_to :back
  else
    flash[:error] = "Status couldn't save"
    redirect_to :back
  end
end

ユーザーコントローラー:

def show
  @user = User.find(params[:id])
  @status = @user.status
  @new_status = current_user.build_status
end

ユーザー/ショー:

<%= render 'shared/status_form' if @user == current_user %>

共有/Status_form:

<%= form_for[@new_status], :url => user_status_path(current_user) do |f| %>
  <%= render 'shared/error_messages', object: f.object %>
  <div class="field">
    <%= f.text_area :content, id:"status_box", placeholder: "Status?" %>
  </div>
  <%= f.submit "Update", id:"status_btn", class: "btn btn-small btn-primary" %>
<% end %>

ルート:

resources :users do
  resource :status, only: [:create, :destroy]
end

これは見るべきことがたくさんあることを知っていますが、助けてくれて本当に感謝しています。

4

3 に答える 3

1

あなたのコードにはいくつか問題があります。

  1. あなたは と を交換@userしていcurrent_userます。その理由はありますか?params[:id] で取得したユーザーのステータス フォームを生成していますが、create メソッドでStatusControllerは常に現在のユーザーのステータスを作成しようとしています。これら 2 人のユーザーは同じではありません。
  2. メソッドではcreate、ユーザーの関連付けを除いて空である、新しく構築されたステータス インスタンスを保存しようとしています。これにより、 に対して検証エラーが発生するはずcontentです。

このようなことを試してください(テストしていませんが、有利なスタートを切るはずです):

ルート.rb:

resources :users do
  resource :status, only: [:create, :destroy]
end

statuses/_form.html.erb:

<%= form_for [@user, @status] do |f| %>
  <%= render 'shared/error_messages', object: f.object %>
  <div class="field">
    <%= f.text_area :content, id:"status_box", placeholder: "Status?" %>
  </div>
  <%= f.submit "Update", id:"status_btn", class: "btn btn-small btn-primary" %>
<% end %>

ステータスコントローラー:

def create
  @status = Status.new(params[:status])
  if @status.save
    flash[:success] = "Status updated!"
    redirect_to :back
  else
    flash[:error] = "Status didn't save"
    redirect_to :back
  end
end

何か問題がありましたらお知らせください。解決策を考えさせていただきます。もう 1 つは、User インスタンスとともにステータスの関連付けを作成することを検討することです (つまり、ユーザーが常にステータスを持つことになっている場合)。@user.statusこのようにして、コントローラーメソッドでビルドする代わりに、いつでも参照できます。

于 2013-01-25T11:10:36.333 に答える
0

設定するパラメーターがありません

@new_status = current_user.build_status(params[:status])

于 2013-01-25T11:55:36.850 に答える
0

build_status の代わりに status を呼び出すべきではありませんか?

@status = current_user.status

この関係はフィールドに名前を付けるため

has_one :ステータス

于 2013-01-25T11:03:07.477 に答える