2013-01-25 2 views
0

У меня есть много пользователей, имеющих один статус. По какой-то причине я не могу получить статусы для сохранения, используя действие create в контроллере состояния. Я предполагаю, что проблема связана с одной ассоциацией, потому что я новичок в ней, но я могу ошибаться.Имеет одну ассоциацию - метод создания контроллера

Настоящий рабочий код.

Модель пользователя:

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 %> 

Shared/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 

Я знаю, что это много, чтобы посмотреть, но я очень ценю помощь, спасибо ,

ответ

0

Отсутствующие в Params, чтобы установить

@new_status = current_user.build_status (PARAMS [: статус])

0

Разве вы не должны вызывать статус вместо build_status?

@status = current_user.status

, поскольку эти отношения имен поле

has_one: Статус

+0

, когда я делаю, что я странно получить неопределенный метод "спасти" от линии, если @ status.save потому что в этом случае нечего экономить? current_user.status будет пустым, не так ли? – Jaqx

1

Я вижу несколько проблем с вашим кодом.

  1. Вы заменяете @user и current_user. Есть ли причина для этого? Вы создаете форму статуса для пользователя, полученного через параметры [: id], но в методе create в вашем StatusController вы всегда пытаетесь создать статус текущего пользователя. Эти два пользователя не совпадают.
  2. В методе create вы пытаетесь сохранить только что созданный экземпляр статуса, который пуст, кроме ассоциации пользователя. Это должно привести к ошибке проверки по сравнению с content.

попробовать что-то вроде этого (не проверял, но должно дать вам фору):

routes.rb:

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

статусы/_form.html.Еврорадио:

<%= 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.status вместо того, чтобы строить один в методе контроллера.

+0

Я изучаю это, но еще ничего не получил. Я думаю, мне нужна часть url в form_for, иначе она попыталась отправить статус в статусы вместо статуса. nvm, вы еще не видели обновленный код – Jaqx

+0

Хм, я думаю, они должны были это исправить. Вот аналогичный поток http://stackoverflow.com/questions/2261827/nested-form-for-singular-resource, идущий на 2+ года назад. Если нет, то да, попробуйте явно указать ему 'user_status_path (@user , @status) 'в качестве URL-адреса. – HargrimmTheBleak

+0

Причина, по которой я меняю их, состоит в том, что, когда вы находитесь в профиле пользователей, мне нужно показать этого пользователя с помощью @user. Однако, когда я хочу создать статус, только текущий зарегистрированный пользователь может создать статус для себя. – Jaqx

Смежные вопросы