有一个关联 - 控制器创建方法

时间:2013-01-25 10:44:37

标签: ruby-on-rails controller associations

我有很多用户都有一个状态。出于某种原因,我无法使用状态控制器中的创建操作来获取要保存的状态。我认为问题涉及有一个关联,因为我是新手,但我可能很容易出错。

这是现在的工作代码。

用户模型:

 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

我知道这很重要,但我非常感谢你的帮助,谢谢。

3 个答案:

答案 0 :(得分:1)

我可以看到您的代码存在一些问题。

  1. 您正在交换@usercurrent_user。这有什么理由吗?您正在为通过params [:id]检索的用户生成状态表单,但在StatusController中的create方法中,您始终尝试创建当前用户的状态。这两个用户不一样。
  2. create方法中,您尝试保存新建的状态实例,除了用户关联外,该实例为空。这会导致针对content的验证错误。
  3. 尝试这样的事情(没有经过测试,但应该给你一个良好的开端):

    routes.rb中:

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

    状态/ _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 %>
    

    StatusesController:

    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
    

    如果您有任何问题,请告诉我们,以便我们找到解决方案。另一件事是您可以考虑与User实例一起创建状态关联(即,如果用户总是应该具有状态)。这样,您始终可以引用@user.status而不是在控制器方法中构建一个。

答案 1 :(得分:0)

你不应该调用status而不是build_status吗?

@status = current_user.status

因为这段关系命名字段

has_one:status

答案 2 :(得分:0)

缺少要设置的参数

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